为什么 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 作业外,应避免在所有情况下使用它们。
需要分区键上的相等性才能使协调器具有有效查询的任何外观,以了解将请求发送到何处。我强烈建议仅使用相等性并更改您的数据模型,以便您可以通过这种方式满足查询。
文档清楚地表明,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 作业外,应避免在所有情况下使用它们。
需要分区键上的相等性才能使协调器具有有效查询的任何外观,以了解将请求发送到何处。我强烈建议仅使用相等性并更改您的数据模型,以便您可以通过这种方式满足查询。