2017-01-23 68 views
0

我分別使用SimpleStatement和BoundStatement從Cassandra中選擇數據100次。
我發現BoundStatement沒有提高太多。BoundStatement比Cassandra中的SimpleStatement更有效嗎?

然而,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

這是因爲你的迭代次數太少。 100是不足以看出差異。

但他們都做的相當多的同樣的工作,除了簡單的語句結尾:

  • 只做一次旅行卡桑德拉節點。
  • 不保留任何預先存儲在節點內存中的語句。

那麼是什麼使得BoundStatement不同的是,你一旦做準備,綁定和執行它多次

所以一旦你準備了BoundStatement,你只能通過連接發送綁定變量。而不是整個聲明。所以從那裏應該會出現效率的差異。

你能做些什麼是啓用跟蹤並檢查實際的語句花多少時間和地點。

以及測試我會建議實際上在開始測量前的時間做一些熱身。由於有很多因素,實際上可以影響結果。

PD:我認爲ValidData.getOnePk()返回隨機數據,你不打卡桑德拉行高速緩存。

+0

非常感謝你。 – niaomingjian

相關問題