文档很清楚,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
的事情,那么是否在其他地方记录了在这种情况下允许使用什么运算符?
答案 0 :(得分:3)
分区键按令牌顺序排列,因此>
之类的东西需要从所有副本集中读取整个数据集,过滤掉不匹配的内容。这是极其低效且昂贵的(这就是为什么需要允许过滤的原因)。 !=也是如此,通常C *会拒绝执行任何需要读取一切的操作,因为这仅仅是数据库不适合的。允许过滤允许在某些情况下执行Spark作业之类的事情,但是除了随机单次运行操作调试任务或经过深思熟虑的olap作业之外,在所有情况下都应避免使用它们。
要求分区键具有相等的外观,以使其具有高效的查询外观,以便协调器知道将请求发送到哪里。我强烈建议您仅使用相等性并更改数据模型,以便您可以满足这种查询方式。