Java 为什么BuiltStatement比Cassandra中的BoundStatement更有效?

Java 为什么BuiltStatement比Cassandra中的BoundStatement更有效?,java,cassandra-3.0,Java,Cassandra 3.0,说: BoundStatement:通过将值绑定到准备好的语句来获得。通常用于经常使用不同值执行的查询。 BuiltStatement:使用QueryBuilder DSL构建的语句。它可以像一条简单的语句一样直接执行,也可以准备好 所以在我看来,BuiltStatement等于BoundStatement。 然而,在我的例子中,我发现BuiltStatement显然比BoundStatement更有效。为什么会这样 public static void main(String[] ar

说:

BoundStatement:通过将值绑定到准备好的语句来获得。通常用于经常使用不同值执行的查询。
BuiltStatement:使用QueryBuilder DSL构建的语句。它可以像一条简单的语句一样直接执行,也可以准备好

所以在我看来,BuiltStatement等于BoundStatement。 然而,在我的例子中,我发现BuiltStatement显然比BoundStatement更有效。为什么会这样

    public static void main(String[] args) {
        Data mc = null;
        ResultSet results = null;
        PK pk = null;
        CassandraData dao = new CassandraData();
        Session session = dao.getSession();
        long start, end;
        long start0 = System.currentTimeMillis();
//      PreparedStatement prepared = session.prepare(
//              "select * from test where E=? and D=? and M=?");
        Statement statement = null;
        logger.info("Start:");
        for (int i = 0; i < 100; i++) {
            pk = ValidData.getOnePk();
            start = System.currentTimeMillis();

//          statement = prepared.bind(pk.E, pk.D, pk.M);
//          statement.setReadTimeoutMillis(100000);

            statement = getSelect(pk);

            results = session.execute(statement);
            end = System.currentTimeMillis();
            logger.info("Show OneKb:" + (end - start) / 1000.0 + "s.");
        }

        long end0 = System.currentTimeMillis();
        logger.info("Show OneKb Average:" + (end0 - start0) / 1000.0 / 100 + "s/OneKb.");
    }

    private static Statement getSelect(PK pk) {
        Select ss = QueryBuilder.select().from("test");
        ss.setConsistencyLevel(com.datastax.driver.core.ConsistencyLevel.ONE);
        ss.where(QueryBuilder.eq("E", pk.E))
                .and(QueryBuilder.eq("D", pk.D))
                .and(QueryBuilder.eq("M", pk.M)).limit(1)
                .setReadTimeoutMillis(100 * 1000);
        return ss;
    }
publicstaticvoidmain(字符串[]args){
数据mc=null;
ResultSet results=null;
PK=null;
CassandraData dao=新的CassandraData();
Session Session=dao.getSession();
漫长的开始,漫长的结束;
long start0=System.currentTimeMillis();
//PreparedStatement prepared=session.prepare(
//“从测试中选择*,其中E=?和D=?和M=?”;
Statement=null;
logger.info(“开始:”);
对于(int i=0;i<100;i++){
pk=ValidData.getOnePk();
start=System.currentTimeMillis();
//语句=prepared.bind(主键E、主键D、主键M);
//声明:setReadTimeoutMillis(100000);
语句=getSelect(主键);
结果=session.execute(语句);
end=System.currentTimeMillis();
info(“Show OneKb:”+(结束-开始)/1000.0+“s.”;
}
long-end0=System.currentTimeMillis();
info(“Show OneKb Average:”+(end0-start0)/1000.0/100+“s/OneKb”);
}
私有静态语句getSelect(PK){
从(“测试”)中选择ss=QueryBuilder.Select();
setconsistentylevel(com.datastax.driver.core.consistentylevel.ONE);
ss.where(QueryBuilder.eq(“E”,pk.E))
和(QueryBuilder.eq(“D”,pk.D))
和(QueryBuilder.eq(“M”,pk.M))。极限(1)
.setReadTimeoutMillis(100*1000);
返回ss;
}

我运行了这个案例100次,
BoundStatement
的平均时间是1.316s,而
buildstatement
的平均时间是0.199s,我发现我错了
在使用BuiltStatement时,我附加了
limit(1)
方法以仅获取一条记录。但是在使用BoundStatement时,我没有附加
limit1
来限制返回的数量。事实上,它将平均返回100条记录。所以在这种情况下,速度较慢