我创建了一个简单的tabe:
CREATE TABLE test (
"type" varchar,
"value" varchar,
PRIMARY KEY(type,value)
);
我在其中插入了5行:
INSERT INTO test(type,value) VALUES('test','tag1')
INSERT INTO test(type,value) VALUES('test','tag2')
INSERT INTO test(type,value) VALUES('test','tag3')
INSERT INTO test(type,value) VALUES('test','tag4')
INSERT INTO test(type,value) VALUES('test','tag5')
我运行了SELECT * from test LIMIT 3
,它按预期工作。
type | value
------+------
test | tag1
test | tag2
test | tag3
当我跑SELECT COUNT(*) from test LIMIT 3
时,它产生:
count
-------
5
不应该说3吗?
Datastax documentation似乎建议指定LIMIT
将覆盖默认值10,000。为什么在这种情况下不起作用?如果重要的话,我在Cassandra 2.2.5上并通过cqlsh运行所有查询。
更新
Java驱动程序和CQLSH都经过测试,表明LIMIT
确实无法按照文档中的规定运行。如果有任何Datastax员工阅读,我们将非常感谢您的意见。
答案 0 :(得分:10)
我对此的自发回应是行计数总是只返回结果集中的一行,说明找到的行数。因此任何大于1的LIMIT都不会产生影响。
但正如@light正确指出的那样,文档说明LIMIT应该适用于count(*)
。并且有充分的理由。根据{{3}},Cassandra无法获取任何元数据来提供数字或行,但必须检查每个分区(在每个节点上)以获得该数字。因此这是一项非常昂贵的操作。
但是,与文档相反,当使用cqlsh或使用Java驱动程序(v3.0.0)查询C * 2.2.4时,LIMIT
子句对报告的行数没有影响。没有10,000行的cqlsh的默认限制。如果超过10'000,则LIMIT不大于10'000。
文档和实现似乎不同步。虽然哪一个不正确但我不能说。
修改强>
@Abhishek Anand引用的票证结束了this blog post。不是行为。因此,指定限制为1将计算所有行。这是理想的行为。
答案 1 :(得分:9)
这是cassandra中的一个Bug,版本2.2.x受其影响。
https://issues.apache.org/jira/browse/CASSANDRA-8216
他们已将其标记为已修复,但显然已将其传播到固定版本以外的版本。
无论如何,光明,你的假设/思考是完全正确的。 限制关键字必须应用于cassandra的计数(*),并且它在我正在使用的3.2.4和2.1.x版本中应该正常工作
答案 2 :(得分:2)
limit子句用于限制结果中的行数。 count(*)只返回一行,其中包含(在这种情况下)总行数。
“限制3”不会影响从计数(*)分析的事件数量,如果你想要这个,你最常使用的是“where”