2017-01-23 7 views
0

私はそれぞれSimpleStatementとBoundStatementを使ってCassandraのデータを100回選択します。
BoundStatementがあまり改善していないことがわかりました。BoundStatementはCassandraのSimpleStatementよりも効率的ですか?

しかし、this linkは言う:

SimpleStatement:文字列から直接構築された単純な実装を。通常、1回または数回だけ実行される照会に使用されます。
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の違いを見るには不十分です。

しかし、最終的にはどちらも簡単な文であることを除いて、非常に多くの同じジョブを実行します。

  • のみカサンドラノードへの1回の旅行をしています。
  • 準備されたステートメントをノードメモリに保存しません。

だから何BoundStatementが違うことは、あなたがそれを複数回を、一度準備を結合して、実行ということです。

したがって、BoundStatementを準備したら、接続上でのみバインディング変数を送信します。そして全体の声明ではない。だからそこから効率の違いが来るはずです。

その他にできることは、トレースを有効にして、実際のステートメントの所要時間と場所を確認することです。

テストのために実際に時間を計測する前にウォームアップを行うことをおすすめします。結果に実際に影響を与える要因はたくさんあるため、

PD:ValidData.getOnePk()がランダムなデータを返し、Cassandraの行キャッシュにヒットしていないとします。

+0

ありがとうございました。 – niaomingjian

関連する問題