[jira] [Updated] (CASSANDRA-5649) Move resultset type information into prepare, not execute

2013-07-01 Thread Jonathan Ellis (JIRA)

 [ 
https://issues.apache.org/jira/browse/CASSANDRA-5649?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jonathan Ellis updated CASSANDRA-5649:
--

Reviewer: iamaleksey

> Move resultset type information into prepare, not execute
> -
>
> Key: CASSANDRA-5649
> URL: https://issues.apache.org/jira/browse/CASSANDRA-5649
> Project: Cassandra
>  Issue Type: Improvement
>Reporter: Jonathan Ellis
>Assignee: Sylvain Lebresne
> Fix For: 2.0 beta 1
>
>
> Native protocol 1.0 sends type information on execute.  This is a minor 
> inefficiency for large resultsets; unfortunately, single-row resultsets are 
> common.
> This does represent a performance regression from Thrift; Thrift does not 
> send type information at all.  (Bad for driver complexity, but good for 
> performance.)

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira


[jira] [Updated] (CASSANDRA-5649) Move resultset type information into prepare, not execute

2013-06-18 Thread Jonathan Ellis (JIRA)

 [ 
https://issues.apache.org/jira/browse/CASSANDRA-5649?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jonathan Ellis updated CASSANDRA-5649:
--

Fix Version/s: (was: 2.0)
   2.1

This doesn't look negligible at all to me.  Here's the metadata encode:

{code}
public ChannelBuffer encode(Metadata m)
{
boolean globalTablesSpec = 
m.flags.contains(Flag.GLOBAL_TABLES_SPEC);

int stringCount = globalTablesSpec ? 2 + m.names.size() : 3* 
m.names.size();
CBUtil.BufferBuilder builder = new CBUtil.BufferBuilder(1 + 
m.names.size(), stringCount, 0);

ChannelBuffer header = ChannelBuffers.buffer(8);
header.writeInt(Flag.serialize(m.flags));
header.writeInt(m.names.size());
builder.add(header);

if (globalTablesSpec)
{
builder.addString(m.names.get(0).ksName);
builder.addString(m.names.get(0).cfName);
}

for (ColumnSpecification name : m.names)
{
if (!globalTablesSpec)
{
builder.addString(name.ksName);
builder.addString(name.cfName);
}
builder.addString(name.toString());

builder.add(DataType.codec.encodeOne(DataType.fromType(name.type)));
}
return builder.build();
}
{code}

Here's the (per-row) ResultSet encode:

{code}
for (ByteBuffer bb : row)
builder.addValue(bb);
{code}

Hmm. :)

Seriously, it's trivial to see how you will more often than not have more 
metadata than row data for typical single-row resultsets.  I can put together a 
wrapper to prove it but it's kind of a waste of time.

You're right that it's not reasonable to try for 2.0, though.  Moved to 2.1.

> Move resultset type information into prepare, not execute
> -
>
> Key: CASSANDRA-5649
> URL: https://issues.apache.org/jira/browse/CASSANDRA-5649
> Project: Cassandra
>  Issue Type: Improvement
>Reporter: Jonathan Ellis
>Assignee: Sylvain Lebresne
> Fix For: 2.1
>
>
> Native protocol 1.0 sends type information on execute.  This is a minor 
> inefficiency for large resultsets; unfortunately, single-row resultsets are 
> common.
> This does represent a performance regression from Thrift; Thrift does not 
> send type information at all.  (Bad for driver complexity, but good for 
> performance.)

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira