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
Cassandra查询性能:对复合分区键的一部分使用IN子句_Cassandra_Query Optimization_Datastax Java Driver - Fatal编程技术网

Cassandra查询性能:对复合分区键的一部分使用IN子句

Cassandra查询性能:对复合分区键的一部分使用IN子句,cassandra,query-optimization,datastax-java-driver,Cassandra,Query Optimization,Datastax Java Driver,我目前在Cassandra中设置了一个表,该表包含文本、十进制或日期类型列,其中包含业务日期和帐号的组合分区键。对于此表的查询,我需要能够支持在给定日期查找单个帐户或帐户列表 例如: select x,y,z from my_table where business_date = '2019-04-10' and account_number IN ('AAA', 'BBB', 'CCC') //Note: Both partition keys are provided for this qu

我目前在Cassandra中设置了一个表,该表包含文本、十进制或日期类型列,其中包含业务日期和帐号的组合分区键。对于此表的查询,我需要能够支持在给定日期查找单个帐户或帐户列表

例如:

select x,y,z from my_table where business_date = '2019-04-10' and account_number IN ('AAA', 'BBB', 'CCC')
//Note: Both partition keys are provided for this query
我一直在努力解决与访问此数据相关的性能问题,因为我注意到我在试图理解/解释延迟模式时遇到困难

在许多情况下,客户机应用程序可以在短时间内总共运行三次相同的查询。对于这些场景,我看到三分之二的请求的响应时间非常糟糕(800毫秒),其中一个请求的响应时间非常快(50毫秒)。起初我认为这是由于键缓存或行缓存造成的,但是,我不太确定,因为我认为如果这是真的,那么三个请求中的第三个应该总是最快的,事实并非如此

我认为我面临的第二个问题是实际的数据模型本身。尽管提交查询时提供了所有分区键,但由于它是IN子句,结果将是单独的分区,并且可以分布在集群中,因此,这将是一种糟糕的访问模式。然而,当运行单帐户查询时,我看到这些延迟问题。此外,我看到15-20个帐户的查询执行得非常好(低于50ms),所以我不确定数据模型是否真的是个问题

群集设置:

  • 数据中心:2个
  • 每个数据中心的节点数:3
  • 密钥空间复制:本地\u dc=2,远程\u dc=2
Java驱动程序集:

  • 负载平衡:DCAware与LatencyWare
  • 协议:v3
  • 查询仍然设置为使用“IN”子句,而不是异步单个查询
  • 阅读一致性:本地

有没有人对我应该关注的问题有什么想法/线索,以便真正确定这个问题的根本原因?

在分区键上使用
中的
始终是个坏主意,即使对于复合分区键也是如此。分区键的值定义了数据在集群中的位置,分区键的不同值很可能会将数据放在不同的服务器上。在这种情况下,协调节点(接收查询的节点)需要联系保存数据的节点,等待这些节点传递结果,然后才将结果发送回您

若您需要查询多个分区键,那个么异步发出单个查询并在客户端收集结果会更快


另外,请注意,当您使用
PreparedStatement
时,TokenAware策略工作得最好-在这种情况下,驱动程序能够提取分区密钥的值,并找到哪个服务器为其保存数据。

相关:谢谢@alex ott。如果IN子句是一个问题,您是否知道如何解释以下内容:“但是,即使运行单帐户查询,我也会看到这些延迟问题。此外,我看到15-20个帐户的查询执行得非常好(低于50毫秒),因此我不确定数据模型是否真的是一个问题。”某些分区上的查询速度慢可能是由以下几个原因造成的:给定分区中有很多逻辑删除、非常大的分区、太多的SSTables等。您可以在给定的表上执行
nodetool tablestats
,查看最大的分区是什么,上次请求中读取了多少逻辑删除,等。
nodetool表格直方图对于获取高百分位数的统计信息也很有用