cassandra 单个分区上的CQL COUNT()也是一个开销很大的操作吗?

dnph8jn4  于 2023-04-11  发布在  Cassandra
关注(0)|答案(2)|浏览(228)

我知道Cassandra count()是一个昂贵的操作,因为它需要一个完整的表扫描。https://www.datastax.com/blog/running-count-expensive-cassandra
但是,假设我们有一个表hotel,其中hotel_type作为分区键,我们运行query

select count(*) from hotel where hotel_type= 'luxury';

这也会很昂贵吗?实际上,我需要运行100万个这样的查询来获得不同hotel_types的计数。查找计数会影响prod Cassandra集群吗?
更新:
我看到我们可以使用dsbulk进行计数。dsbulk count和cql count()有什么不同?

6yt4nkrj

6yt4nkrj1#

你是对的,在Cassandra中,无限的COUNT()是一个昂贵的操作,原因我已经在这篇文章中解释过了--https://dba.stackexchange.com/questions/314567/
但是计算单个分区的行数(即SELECT查询受到WHERE pk = ?的限制)是CQL COUNT()函数的有效用例。
此外,如果您将请求限制到集群可以处理的吞吐量,那么异步执行一百万个读取操作应该是很好的。
DataStax Bulk Loader (DSBulk)工具中的count命令是运行完整表计数的推荐方法之一,因为DSBulk通过将其分解为小的令牌段来优化操作,然后发出多个分布式请求,而不是单个完整表扫描。
如果您感兴趣,这里有一些参考资料,其中包含使用DSBulk的示例:

干杯!

whlutmcx

whlutmcx2#

Cassandra模型化的主要概念是主键,它确定数据在集群上的物理位置
当主键与a count()函数一起使用时,协调器节点(处理请求的节点)将在本地检索所有关联的数据,然后在本地应用聚合操作
由于此请求通过主键进行过滤,并且不需要扫描集群中表的所有数据,因此您可以使用它
但是,您需要记住,这将导致协调器节点上消耗更多的资源,并且在进入生产环境之前,工作台将很有帮助

相关问题