Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在CQL中使用IN-condition用于分区密钥而不会降低性能_Java_Cassandra_Cql_Anti Patterns_Where In - Fatal编程技术网

Java 在CQL中使用IN-condition用于分区密钥而不会降低性能

Java 在CQL中使用IN-condition用于分区密钥而不会降低性能,java,cassandra,cql,anti-patterns,where-in,Java,Cassandra,Cql,Anti Patterns,Where In,我已经知道在()中使用反模式 但如果我有一组属于同一标记的分区键呢 那么,假设我们有下一个代码: public ResultSet getDataForFirstTokenRange(List<String> initialKeys) Cluster cluster = Cluster.builder().addContactPoints(DEFAULT_SEEDS) .withClusterName(DEFAULT_CLUSTER_NAME).build();

我已经知道在()中使用反模式

但如果我有一组属于同一标记的分区键呢

那么,假设我们有下一个代码:

public ResultSet getDataForFirstTokenRange(List<String> initialKeys)
    Cluster cluster = Cluster.builder().addContactPoints(DEFAULT_SEEDS)
      .withClusterName(DEFAULT_CLUSTER_NAME).build();
    Metadata meta = cluster.getMetadata();
    Set<TokenRange> tokens = meta.getTokenRanges();
    TokenRange firstTr = tokens.iterator().next();

    List<String> filteredKeys = filterKeysForToken(firstTr, initialKeys, meta)
    return session.execute(
         "select * from MY_TABLE where key IN (" + 
              String.join(
                   ", ", 
                   filteredKeys.stream()
                       .map(key -> "'" + key + "'")
                       .collect(Collectors.toList())
              )  + 
              ")"
    );
}

private List<String> filterKeysForToken(TokenRange tr, List<String> keys, Metadata meta) {
    return keys.stream()
            .filter(key -> {
                Token token = meta.newToken(TypeCodec.varchar().serialize(
                        key, 
                        ProtocolVersion.NEWEST_SUPPORTED
                ));
                return tr.contains(token);
            })
            .collect(Collectors.toList());
}
公共结果集getDataForFirstTokenRange(列出初始密钥) Cluster Cluster=Cluster.builder().addContactPoints(默认种子) .withClusterName(默认集群名称).build(); Metadata meta=cluster.getMetadata(); Set tokens=meta.getTokenRanges(); TokenRange firstTr=tokens.iterator().next(); List filteredKeys=filterKeysForToken(firstTr、initialKeys、meta) 返回会话。执行( “从输入的MY_表中选择*”(+ String.join( ", ", filteredKeys.stream() .map(键->“'+key+”)) .collect(收集器.toList()) ) + ")" ); } 私有列表筛选器Keysfortoken(令牌范围tr、列表密钥、元数据元){ 返回keys.stream() .过滤器(键->{ Token Token=meta.newToken(TypeCodec.varchar().serialize( 钥匙 支持ProtocolVersion.u )); 返回tr.contains(令牌); }) .collect(Collectors.toList()); } 所以,这里我过滤分区键的初始列表,这样结果列表只属于一个令牌范围

然后我提出了一个问题

所以问题是,这里会有性能问题吗?
如果没有,这种方法会比为每个分区键执行单独的查询更好吗?

我假设您已经知道分区键告诉Cassandra节点数据存储在哪个节点中

从功能上讲,拥有多个异步查询和一个IN子句是同一回事:您将命中集群中的一个节点。但是,拥有IN子句应该是一个主要的性能影响,因为协调器在将答案返回给客户机之前等待所有数据可用。相反,如果发出多个异步查询,则会有单独的流到客户端,每个查询一个流,并且应该能够更快地处理数据