【问题标题】:Cassandra Java driver Performance : CQL Queries with IN Clause having high no of valuesCassandra Java 驱动程序性能:具有高值的 IN 子句的 CQL 查询
【发布时间】:2018-08-24 23:16:03
【问题描述】:

我们正在使用 Datastax Cassandra Java 驱动程序(版本 3.x)。有一个带有“IN”子句的已记录批处理 Select 语句,具有大量值。因此,我们面临着性能低下的严重问题。以下是调试 Java 应用程序时可见的查询格式:

SELECT COL1, COL2, ... FROM XXXX WHERE PARTITIONKEY IN () 和 CLUSTERINGKEY IN();

任何人都可以分享当有大量值可以在其中传递时,如何处理具有多个 IN 子句的此类 SELECT。

Session#executeAsync 是否可以解决这个问题。

谢谢。

【问题讨论】:

  • 查询在 IN 子句中的值很高:SELECT COL1, COL2, ... FROM XXXX WHERE PARTITIONKEY IN (val1, val2... val N) AND CLUSTERINGKEY IN(val1, val2.. . 值 N);两个 IN 子句的值都相同
  • 更新您的问题而不是评论。

标签: java cassandra cassandra-2.0 cassandra-3.0 cqlsh


【解决方案1】:

不要对分区键使用 IN 查询(​​如果性能不是问题,您可以使用有限数量的固定数据)。它给 Coordinator 节点带来了很多工作。您可以使用 IN 作为集群键,但也要确保您的列表不要太大。

executeAsync 是这里最好的方法。我在这里添加一个代码sn-p。

PreparedStatement getInfo = session.prepare("SELECT COL1, COL2, ... FROM XXXX WHERE PARTITIONKEY = ?");

        List<ResultSetFuture> futures = new ArrayList<>();
        for (Object key : list) {
            ResultSetFuture future = session.executeAsync(getInfo(key));
            futures.add(future);
        }
        for (ResultSetFuture future : futures) {
            try {
                ResultSet rs = future.getUninterruptibly();
                Row rw = rs.one();
                if (rw != null) {
                    // set DB info into list or DTO 
                }
            } catch (Exception e) {
                // print log
                LOGGER.error("", e);
            }
        }

这是一个示例代码。请阅读此链接了解更多详情:

Cassandra Query Patterns: Not using the “in” query for multiple partitions.

【讨论】:

    猜你喜欢
    • 2013-05-30
    • 2013-10-22
    • 2023-02-15
    • 2015-08-06
    • 2014-07-29
    • 2015-09-13
    • 2012-08-01
    • 2016-04-08
    • 2020-08-18
    相关资源
    最近更新 更多