【问题标题】:Cassandra CQL Select count with LIMITCassandra CQL 选择计数与 LIMIT
【发布时间】:2016-07-10 13:05:13
【问题描述】:

我创建了一个简单的表格:

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 员工阅读,我们将不胜感激。

【问题讨论】:

    标签: cassandra cql datastax


    【解决方案1】:

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

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

    他们已将其标记为已修复,但显然这已传播到固定版本之外的版本。

    无论如何,光,你的假设/想法是完全正确的。 必须在 cassandra 的 count(*) 上应用限制关键字,并且它在我正在处理的 3.2.4 和 2.1.x 版本中可以正常工作

    【讨论】:

    • 我有 cassandra [cqlsh 5.0.1 |卡桑德拉 3.6 | CQL 规范 3.4.2 |本机协议 v4]。当我使用此查询时 - SELECT COUNT(*) from kwhhourlyconsumption LIMIT 3;我得到错误的输出,即 87 并带有警告 - “使用没有分区键的聚合查询”。如果我遗漏了什么,请告诉我。 @Abhishek Anand
    【解决方案2】:

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

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

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

    文档和实现似乎不同步。虽然我不能说哪个是不正确的。

    编辑

    @Abhishek Anand 引用的票证得出结论,documentation is wrong.不是行为。因此,将限制指定为 1 将计算所有行。这就是期望的行为。

    【讨论】:

    • 如果SELECT COUNT 总是返回1 行,LIMIT 子句在SELECT COUNT 查询中是没有用的,不是吗?为什么 Datastax 文档会专门给出 SELECT COUNT(*) FROM big_table LIMIT 50000; 之类的示例?
    • @light,嗯,你是对的。文档建议在与 LIMIT 子句结合使用时,您应该得到 3 作为计数的结果。这个article 解释了为什么将限制应用于计数是一件好事。我将在我的实例上进行测试(C* v 2.2.4)。你的 C* 版本是什么?
    • 我在 Cassandra v2.2.5
    • @light,这太糟糕了。 ;-) 我希望你在 v3.x 上。该版本中的存储引擎已完全重新设计。 addtl 的潜在存在。元数据可能允许他们移除将 LIMIT 应用于 count() 查询的约束。
    • 我可能会升级到 v3,当它变得更加稳定和得到更好的支持时,即各种语言的驱动程序得到更新。希望还有更好的文档,这样我们就不必为这样的“异常”而摸不着头脑:)
    【解决方案3】:

    limit 子句用于限制结果中的行数。 count(*) 只返回一行(在这种情况下)总行数。

    “限制 3”不影响从 count(*) 分析的出现次数,如果你想要这个,你最多可以使用“where”

    【讨论】:

    • 感谢您的回答。如果SELECT COUNT 总是返回1 行,LIMIT 子句在SELECT COUNT 查询中是没有用的,不是吗?为什么 Datastax 文档会专门给出 SELECT COUNT(*) FROM big_table LIMIT 50000; 之类的示例?
    • 您指的是这个文档吗? --> “SELECT COUNT() FROM big_table LIMIT 50000; SELECT COUNT() FROM big_table LIMIT 200000; 如果数据库中有 105,291 行,这些语句的输出将是:50000 和 105291” 我认为他们混淆了
    • 所以 Datastax 文档有误?
    • 这个问题的答案也表明LIMIT的使用适用于SELECT COUNTstackoverflow.com/questions/8795923/…
    • 我不知道,但是例子表明你只能使用这个函数来增加限制,不能减少限制。也许这就是为什么在你的例子中不起作用
    猜你喜欢
    • 2016-04-14
    • 2014-03-23
    • 1970-01-01
    • 2018-02-21
    • 2014-01-03
    • 2012-02-06
    • 2017-01-14
    • 2013-07-15
    • 2013-09-13
    相关资源
    最近更新 更多