1

我有一些问题让我的大脑围绕着 CQL。我一直在尝试在 CQL3 中使用列切片(我认为这是正确的术语),但所有关于它的文档似乎都参考了 CQL2。

例如我有下表:

CREATE TABLE eventindex (
  key uuid,
  column1 int,
  value uuid,
  PRIMARY KEY (key, column1)
) WITH COMPACT STORAGE

现在,在 CQL2 中,我可以执行以下操作:

select '1234567890'..'1234567895' from eventindex;

它返回所有行范围内的所有列

现在,在 CQL3 中我不能这样做(至少,不能在 cqlsh 上),但我可以这样做:

select value from eventindex WHERE column1 > 1234567890 AND column1 <= 1234567895 allow filtering;

这让我得到了基本相同的信息,但格式略有不同。

问题是——这些是等价的吗?如果我不添加允许过滤,cqlsh 会警告我有关性能问题的事实告诉我,CQL2 版本更有效,并且我的 CQL3 查询运行方式不同,但我真的无法找到一个直接的答案来确认我的直觉在这里。

编辑:让我担心的具体事情是运行 CQL2 查询不会引起 cqlsh 的抱怨,但是运行 CQL3 查询而不“允许过滤”会使 cqlsh 由于担心性能不可预测而拒绝执行查询。

4

2 回答 2

2

我认为它们本质上是相同的,尽管我从未遇到过“允许过滤”命令。令我惊讶的是,您实际上可以完全运行该 cql,而无需指定密钥。它不应该是这样的:

select value from eventindex WHERE key = '<key>' 
AND column1 > 1234567890 AND column1 <= 1234567895

我发现这篇文章对于理解 CQL3 在幕后所做的工作非常有用:

http://www.datastax.com/dev/blog/thrift-to-cql3

于 2013-03-08T17:15:48.330 回答
1

允许过滤命令在那里,因为您的查询可能会导致读取大量(或至少未确定)的数据,这些数据不会在您的查询中使用。

select value from eventindex WHERE column1 > 1234567890 AND column1 <= 1234567895;

此查询将需要读取每一行 - 因为如果不查看该行就无法知道特定行是否在该范围内具有 column1 值。然后过滤掉不满足 WHERE 谓词的行。

考虑到大型数据存储中可能有多少行,默认情况下不允许这样做是可以理解的。但是,在某些情况下,您可能对您的数据足够了解,可以说“这是合理的,我想这样做”。在这种情况下,您可以使用 ALLOW FILTERING 来允许它。

当您使用指定分区键值的谓词(例如 WHERE key = .....)时,您不会收到此消息,因为只需要查看满足这部分谓词的行.

有关详细信息,请参阅以下内容:http: //cassandra.apache.org/doc/cql3/CQL.html#selectStmt

于 2013-06-14T16:38:50.630 回答