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

时间:2018-12-10 19:32:55

标签: cassandra cql

文档很清楚,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的事情,那么是否在其他地方记录了在这种情况下允许使用什么运算符?

1 个答案:

答案 0 :(得分:3)

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

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