我知道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()有什么不同?
2条答案
按热度按时间6yt4nkrj1#
你是对的,在Cassandra中,无限的
COUNT()
是一个昂贵的操作,原因我已经在这篇文章中解释过了--https://dba.stackexchange.com/questions/314567/。但是计算单个分区的行数(即
SELECT
查询受到WHERE pk = ?
的限制)是CQLCOUNT()
函数的有效用例。此外,如果您将请求限制到集群可以处理的吞吐量,那么异步执行一百万个读取操作应该是很好的。
DataStax Bulk Loader (DSBulk)工具中的
count
命令是运行完整表计数的推荐方法之一,因为DSBulk通过将其分解为小的令牌段来优化操作,然后发出多个分布式请求,而不是单个完整表扫描。如果您感兴趣,这里有一些参考资料,其中包含使用DSBulk的示例:
干杯!
whlutmcx2#
Cassandra模型化的主要概念是主键,它确定数据在集群上的物理位置
当主键与a count()函数一起使用时,协调器节点(处理请求的节点)将在本地检索所有关联的数据,然后在本地应用聚合操作
由于此请求通过主键进行过滤,并且不需要扫描集群中表的所有数据,因此您可以使用它
但是,您需要记住,这将导致协调器节点上消耗更多的资源,并且在进入生产环境之前,工作台将很有帮助