Почему CQL допускает операторы неравенства с ключом раздела? - PullRequest
0 голосов
/ 10 декабря 2018

В документации ясно, что в 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 голосов
/ 10 декабря 2018

Ключ раздела находится в порядке токенов, поэтому такие вещи, как >, требуют чтения всего набора данных из всех наборов реплик, отфильтровывая вещи, которые не совпадают.Это ужасно неэффективно и дорого (вот почему требуется разрешить фильтрацию).То же самое относится и к! =, Как правило, C * сразу откажется выполнять любые операции, требующие чтения all , поскольку это просто то, для чего база данных не предназначена.ALLOW FILTERING допускает некоторые случаи этого для таких вещей, как задания Spark, но их следует избегать во всех случаях, кроме случайных одиночных задач оперативной отладки или хорошо продуманных заданий olap.

Равенство в ключе раздела должно иметь любое подобиеэффективного запроса для координатора, чтобы знать, куда отправить запрос.Я настоятельно рекомендую использовать только равенство и изменять модель данных таким образом, чтобы вы могли удовлетворить запросы таким образом.

...