【问题标题】:Why Is BuiltStatement more efficient than BoundStatement in Cassandra?为什么在 Cassandra 中 BuiltStatement 比 BoundStatement 更高效?
【发布时间】:2017-01-24 03:59:07
【问题描述】:

This link 说:

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;
    }

我跑了这个案例100次,BoundStatement的平均时间是1.316sBuiltStatement的平均时间是0.199s

【问题讨论】:

    标签: java cassandra-3.0


    【解决方案1】:

    我发现我错了
    使用 BuiltStatement 时,我附加了 limit(1) 方法以仅获取一条记录。但是在使用BoundStatement时,我并没有附加limit 1来限制返回的数量。实际上,它将返回平均 100 条记录。所以在这种情况下,它会变慢。

    【讨论】:

      猜你喜欢
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 2017-12-20
      • 2016-07-03
      • 2010-10-28
      • 1970-01-01
      相关资源
      最近更新 更多