BoundStatement 真的比 Cassandra 中的 SimpleStatement 更高效吗?
Is BoundStatement really more efficient than SimpleStatement in Cassandra?
我分别使用 SimpleStatement 和 BoundStatement select 来自 Cassandra 的数据 100 次。
我发现 BoundStatement 并没有改善太多。
然而,this link 表示:
SimpleStatement: a simple implementation built directly from a character string. Typically used for queries that are executed only once or a few times.
BoundStatement: obtained by binding values to a prepared statement. Typically used for queries that are executed often, with different values.
在我的案例中,为什么 SimpleStatement 和 BoundStatement 的效率几乎相同?
long start0 = System.currentTimeMillis();
long start;
DataEntity mc = null;
ResultSet results = null;
BoundStatement bs = null;
PK pk = null;
CassandraData dao = new CassandraData();
long end;
Session session = dao.getSession();
//SimpleStatement ss = new SimpleStatement("select * from test where E='"+pk.E+"' and D="+pk.D+" and M="+pk.M);
PreparedStatement prepared = session.prepare(
"select * from test where E=? and D=? and M=?");
for (int i = 0; i < 100; i++) {
start = System.currentTimeMillis();
pk = ValidData.getOnePk();
//results = session.execute(ss);
bs = prepared.bind(pk.E, pk.D, pk.M);
results = session.execute(bs);
end = System.currentTimeMillis();
logger.info("Show One:" + (end - start) / 1000.0 + "s elapsed.");
}
long end0 = System.currentTimeMillis();
logger.info("Show All:" + (end0 - start0) / 1000.0 + "s elapsed.");
是因为你的迭代次数太少了。 100 不足以看出差异。
但最后他们都做了几乎相同的工作,除了简单的声明:
- Cassandra 节点只执行一次。
- 不将任何准备好的语句存储在节点内存中。
所以 BoundStatement 的不同之处在于您准备一次,绑定并执行多次。
因此,一旦您准备好 BoundStatement,您只需通过连接发送绑定变量。而不是整个声明。所以从那里应该是效率的差异。
您还可以做的是启用跟踪并检查语句实际花费的时间和位置。
对于测试,我建议在实际开始测量时间之前先做一些热身。因为实际上有很多因素会影响结果。
PD:我假设 ValidData.getOnePk() returns 随机数据并且您没有访问 Cassandra 行缓存。
我分别使用 SimpleStatement 和 BoundStatement select 来自 Cassandra 的数据 100 次。
我发现 BoundStatement 并没有改善太多。
然而,this link 表示:
SimpleStatement: a simple implementation built directly from a character string. Typically used for queries that are executed only once or a few times.
BoundStatement: obtained by binding values to a prepared statement. Typically used for queries that are executed often, with different values.
在我的案例中,为什么 SimpleStatement 和 BoundStatement 的效率几乎相同?
long start0 = System.currentTimeMillis();
long start;
DataEntity mc = null;
ResultSet results = null;
BoundStatement bs = null;
PK pk = null;
CassandraData dao = new CassandraData();
long end;
Session session = dao.getSession();
//SimpleStatement ss = new SimpleStatement("select * from test where E='"+pk.E+"' and D="+pk.D+" and M="+pk.M);
PreparedStatement prepared = session.prepare(
"select * from test where E=? and D=? and M=?");
for (int i = 0; i < 100; i++) {
start = System.currentTimeMillis();
pk = ValidData.getOnePk();
//results = session.execute(ss);
bs = prepared.bind(pk.E, pk.D, pk.M);
results = session.execute(bs);
end = System.currentTimeMillis();
logger.info("Show One:" + (end - start) / 1000.0 + "s elapsed.");
}
long end0 = System.currentTimeMillis();
logger.info("Show All:" + (end0 - start0) / 1000.0 + "s elapsed.");
是因为你的迭代次数太少了。 100 不足以看出差异。
但最后他们都做了几乎相同的工作,除了简单的声明:
- Cassandra 节点只执行一次。
- 不将任何准备好的语句存储在节点内存中。
所以 BoundStatement 的不同之处在于您准备一次,绑定并执行多次。
因此,一旦您准备好 BoundStatement,您只需通过连接发送绑定变量。而不是整个声明。所以从那里应该是效率的差异。
您还可以做的是启用跟踪并检查语句实际花费的时间和位置。
对于测试,我建议在实际开始测量时间之前先做一些热身。因为实际上有很多因素会影响结果。
PD:我假设 ValidData.getOnePk() returns 随机数据并且您没有访问 Cassandra 行缓存。