2017-01-24 26 views
0

This link說:爲什麼在Cassandra中BuiltStatement比BoundStatement更有效?

BoundStatement:通過結合值來一份聲明中獲得的。通常用於經常執行的查詢,具有不同的值。
BuiltStatement:使用QueryBuilder DSL構建的語句。它可以像一個簡單的語句直接執行,或準備。

所以在我看來,BuiltStatement等於BoundStatement。 Howerver,就我而言,我發現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

回答

0

我找到了哪裏我錯了
使用BuiltStatement時,我追加了limit(1)方法來只提取一條記錄。但是在使用BoundStatement時,我沒有附加limit 1來限制返回的數量。實際上,它會返回平均100條記錄。所以在這種情況下,速度較慢。

相關問題