我们正在使用Datastax Cassandra java驱动程序(版本3.x)。有一个带有'IN'子句的已记录批处理Select语句,具有大量值。由于这个原因,我们面临着一个严重的低绩效问题。以下是调试Java应用程序时可见的查询格式:
SELECT COL1,COL2,... FROM XXXX WHERE PARTITIONKEY IN()和CLUSTERINGKEY IN();
任何人都可以分享当有大量值可以在其中传递时,如何处理具有多个IN子句的SELECT。
Session#executeAsync可以解决此问题。
感谢。
答案 0 :(得分:0)
不要在IN查询中使用分区键(如果性能不是问题,可以使用有限数量的固定数据)。它给Coordinator节点带来了很多工作。您可以使用IN进行聚类键,但也要确保列表不是太大。
executeAsync
是最好的方法。我在这里添加了一个代码片段。
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.