为什么 CQL 允许使用分区键的不等运算符?

Why is CQL allowing inequality operators with partition key?

文档清楚地表明,SELECT 中唯一允许用于分区列的运算符是等于 (=) 和 in[value1, values2[,...]),但是 ALLOW FILTERING,似乎不等运算符是允许的。这是一个简单的例子:

CREATE TABLE dept_emp (
    emp_no      INT,
    dept_no     VARCHAR,
    from_date   DATE,
    to_date     DATE,
    PRIMARY KEY (emp_no, dept_no)
);

insert into dept_emp (emp_no, dept_no, from_date, to_date) values
(1, '9', '1901-01-01', '1920-02-01');
insert into dept_emp (emp_no, dept_no, from_date, to_date) values
(2, '9', '1920-01-01', '1930-01-01');
insert into dept_emp (emp_no, dept_no, from_date, to_date) values
(3, '9', '1920-01-01', '1930-01-01');

SELECT * FROM dept_emp WHERE emp_no > 1 ALLOW FILTERING;

 emp_no | dept_no | from_date  | to_date
--------+---------+------------+------------
      2 |       9 | 1920-01-01 | 1930-01-01
      3 |       9 | 1920-01-01 | 1930-01-01

(2 rows)

我将文档描述为 CQL 解析器将识别的内容,因此预计会出现错误,就像我尝试 != 运算符时遇到的错误一样。如果这只是一个 ALLOW FILTERING 问题,是否在其他地方记录了在这种情况下允许使用哪些运算符?

分区键按令牌顺序排列,因此 > 之类的东西需要从所有副本集中读取整个数据集,过滤掉不匹配的东西。这是非常低效和昂贵的(这就是为什么需要允许过滤)。 != 也是如此,通常 C* 会拒绝执行任何需要读取 everything 的操作,因为它只是数据库不是为之设计的。 ALLOW FILTERING 允许在某些情况下使用这种情况,例如 Spark 作业,但除了随机的单个 运行 操作调试任务或经过深思熟虑的 olap 作业外,应避免在所有情况下使用它们。

需要分区键上的相等性才能使协调器具有有效查询的任何外观,以了解将请求发送到何处。我强烈建议仅使用相等性并更改您的数据模型,以便您可以通过这种方式满足查询。