Cassandra CQL使用LIMIT选择计数

lig*_*ght 17 cql cassandra datastax

我创建了一个简单的tabe:

CREATE TABLE test (
  "type" varchar,
  "value" varchar,
  PRIMARY KEY(type,value)
);
Run Code Online (Sandbox Code Playgroud)

我在其中插入了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')
Run Code Online (Sandbox Code Playgroud)

我跑了SELECT * from test LIMIT 3,它按预期工作.

 type | value
------+------
 test |  tag1
 test |  tag2
 test |  tag3
Run Code Online (Sandbox Code Playgroud)

当我跑SELECT COUNT(*) from test LIMIT 3,它产生:

 count
-------
     5
Run Code Online (Sandbox Code Playgroud)

不应该说3吗?

该Datastax文件似乎表明,指定LIMIT将覆盖10000默认值.为什么在这种情况下不起作用?如果重要的话,我在Cassandra 2.2.5上并通过cqlsh运行所有查询.

更新 Java驱动程序和CQLSH都经过测试,表明LIMIT确实无法按照文档中的规定运行.如果有任何Datastax员工阅读,您的意见将非常感谢.

Ral*_*alf 10

我对此的自发回应是行计数总是只在结果集中返回一行,说明找到的行数.因此任何大于1的LIMIT都不会产生影响.

但正如@light正确指出的那样,文档指出LIMIT应该适用于a count(*).并且有充分的理由.根据这篇博客文章, Cassandra无法提供任何元数据来提供数字或行,但必须检查每个分区(在每个节点上)以获得该数字.因此,这是一项非常昂贵的操作.

但是,与文档相反,当使用cqlsh或Java驱动程序(v3.0.0)查询C*2.2.4时,该LIMIT子句对报告的行数没有影响.没有10,000行的cqlsh的默认限制.如果超过10'000,则LIMIT不大于10'000.

文档和实现似乎不同步.虽然哪一个不正确但我不能说.

编辑

@Abhishek Anand引用的故障证明文档是错误的.不是行为.因此,指定限制为1将计算所有行.这是理想的行为.


Abh*_*and 10

这是cassandra中的一个Bug,版本2.2.x受其影响.

https://issues.apache.org/jira/browse/CASSANDRA-8216

他们已将其标记为已修复,但显然已将其传播到超出固定版本的版本.

无论如何,轻松,你的假设/思考是完全正确的.限制关键字必须应用于cassandra的计数(*),并且它在我正在使用的3.2.4和2.1.x版本中应该正常工作