2017-01-24 2 views
0

This link dit:Pourquoi BuiltStatement est-il plus efficace que BoundStatement à Cassandra?

BoundStatement: obtenu par des valeurs se liant à une déclaration préparée. Généralement utilisé pour les requêtes souvent exécutées avec des valeurs différentes.
BuiltStatement: une instruction créée avec le langage DSL de QueryBuilder. Il peut être exécuté directement comme une simple déclaration, ou préparé.

Donc, à mon avis, BuiltStatement est égal à BoundStatement. Howerver, dans mon cas, j'ai trouvé que BuiltStatement est évidemment plus efficace que BoundStatement. Pourquoi est-ce arrivé?

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

j'ai couru ce cas 100 fois et le temps moyen de BoundStatement était 1.316s et le temps moyen de BuiltStatement était 0.199s.

Répondre

0

J'ai trouvé où j'avais tort.
Lors de l'utilisation de BuiltStatement, j'ai ajouté la méthode limit(1) pour extraire un seul enregistrement. Mais lors de l'utilisation de BoundStatement, je n'ai pas ajouté limit 1 pour restreindre la quantité retournée. En fait, il retournera en moyenne 100 enregistrements. Donc, dans cette condition, c'était plus lent.