也许这是一个愚蠢的问题,但我无法确定Cassandra中桌子的大小。
这就是我的尝试:
select count(*) from articles;
如果表格很小,它可以正常运行,但一旦填满,我总会遇到超时问题:
cqlsh:
DBeaver:
我认为它会超时并且只是中止。表中的实际条目数可能要高得多。
我正在测试一个完全空闲的本地Cassandra实例。我不介意它是否必须进行全表扫描并且在此期间没有响应。
有没有办法可靠地计算Cassandra表中的条目数?
我正在使用Cassandra 2.1.13。
答案 0 :(得分:13)
据我所知,问题与 cqlsh 的超时有关:OperationTimedOut:errors = {},last_host = 127.0.0.1
你可以通过选项简单地增加它:
<tabset justified="true" class="tabsetnowrap">
<tab ng-repeat="tab in tabshomepage track by $index" heading="{{tab.title}}" ng-click="homePageNavigate(tab.type)" active="tab.active" disabled="tab.disabled">
</tab>
答案 1 :(得分:10)
以下是我目前的解决方法:
COPY articles TO '/dev/null';
...
3568068 rows exported to 1 files in 2 minutes and 16.606 seconds.
背景:Cassandra支持 export a table to a text file,例如:
COPY articles TO '/tmp/data.csv';
Output: 3568068 rows exported to 1 files in 2 minutes and 25.559 seconds
这也匹配生成的文件中的行数:
$ wc -l /tmp/data.csv
3568068
答案 2 :(得分:8)
有没有办法可靠地计算Cassandra表中的条目数?
简单回答是否。这不是 Cassandra 限制,而是分布式系统难以可靠地计算唯一项目。
HyperLogLog 等近似算法的挑战。
一种可能的解决方案是在Cassandra中使用计数器来计算不同行的数量,但即使计数器也会在某些极端情况下计算错误,因此您将获得一个几个%的错误。
答案 3 :(得分:3)
这是一个很好的计数行,可以避免在Cassandra中运行大COUNT(*)
时发生的超时问题:
答案 4 :(得分:0)
您可以使用Cassandra nodetool:
nodetool tablestats <keyspaceName>.<tableName>
得到回应:
键数(估计值):计数
答案 5 :(得分:0)
您可以使用复制来避免Cassandra超时通常在count(*)上发生
使用此bash
cqlsh -e "copy keyspace.table_name (first_partition_key_name) to '/dev/null'" | sed -n 5p | sed 's/ .*//'
答案 6 :(得分:-1)
原因很简单:
当你使用时:
SELECT count(*) FROM articles;
它对数据库的影响与:
相同SELECT * FROM articles;
您必须查询所有节点。卡桑德拉只是暂停了。
您可以更改超时,但这不是一个好的解决方案。 (有一段时间它很好,但不要在常规查询中使用它。)
有一个更好的解决方案:让您的客户计算您的行数。您可以在插入它们时创建一个计算行数的Java应用程序,并使用Cassandra表中的计数器列插入结果。