我分别使用SimpleStatement和BoundStatement从Cassandra中选择100次数据 我发现BoundStatement并没有太多改进。
但是,this link说:
SimpleStatement:直接由字符串构建的简单实现。通常用于仅执行一次或几次的查询 BoundStatement:通过将值绑定到预准备语句而获得。通常用于经常执行且具有不同值的查询。
就我而言,为什么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.");
答案 0 :(得分:0)
因为你的迭代次数太少了。 100还不足以看出差异。
但最后他们都做了很多相同的工作,除了简单的声明:
那么使BoundStatement与众不同的是你准备一次,绑定并执行多次。
因此,一旦准备好BoundStatement,您只需通过连接发送绑定变量。而不是整个声明。因此,应该有效率的差异。
您还可以做的是启用跟踪并检查实际语句花费的时间和位置。
为了进行测试,我建议在实际开始测量时间之前进行一些预热。因为有很多因素可以影响结果。
PD:我假设ValidData.getOnePk()返回随机数据而您没有访问Cassandra行缓存。