首页 文章

BoundStatement真的比Cassandra中的SimpleStatement更有效吗?

提问于
浏览
0

我分别使用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.");

1 回答

  • 0

    这是因为你做的迭代太少了 . 100不足以看出差异 .

    但最后他们都做了很多相同的工作,除了简单的陈述:

    • 只有一次前往Cassandra节点 .

    • 不会将任何准备好的语句存储在节点内存中 .

    那么使BoundStatement与众不同的是你 prepare it once, bind and execute it multiple times .

    因此,一旦准备好BoundStatement,您只需通过连接发送绑定变量 . 而不是整个声明 . 因此,应该有效率的差异 .

    你还能做些什么是启用跟踪并检查实际语句花费的时间和位置 .

    为了进行测试,我建议在实际开始测量时间之前进行一些预热 . 因为有很多因素可以影响结果 .

    PD:我假设ValidData.getOnePk()返回随机数据而您没有访问Cassandra行缓存 .

相关问题