为什么 CQL 允许带有分区键的不等式运算符?

Pau*_*son 0 cql cassandra

SELECT文档清楚地表明,在 a 中允许与分区列一起使用的唯一运算符是 equals ( =) 和in[value1, values2[,...]),但是, with 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)
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ink 5

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

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