Почему оптимизация ключевого префикса не работает со вторичным индексом в столбце кластеризации?
Scylla DB реализует так называемую " оптимизацию префикса ключа" для вторичных индексов, которая устраняет фильтрацию, если указана часть первичного ключа. Например, можно выполнить SELECT * FROM A WHERE a = 'a' AND b = 'a' AND d = 'a';
на столе A
,
CREATE TABLE A (
a text,
b text,
c text,
d text,
PRIMARY KEY(a,b,c)
);
CREATE INDEX A_index ON A (d);
Но это не сработает, если A.d
столбец кластеризации. Например, как в таблице B
ниже.
CREATE TABLE B (
a text,
b text,
c text,
d text,
PRIMARY KEY(a,b,c,d)
);
CREATE INDEX B_index ON B (d);
Приведенный выше запрос SELECT завершается ошибкой:
InvalidRequest: Ошибка от сервера: code=2200 [Invalid query] message="Невозможно выполнить этот запрос, поскольку он может включать фильтрацию данных и, следовательно, может иметь непредсказуемую производительность. Если вы хотите выполнить этот запрос, несмотря на непредсказуемость производительности, используйте ALLOW FILTERING"
ScyllaDB 3.0.1.
1 ответ
Спасибо за нахождение интересного углового дела:)
Проблема в том, что второй запрос ограничивает кластеризацию столбцов (b, d)
, что само по себе не образует префикс ключа кластеризации. Конечно, d
индексируется, так что должно произойти, используя a
в оптимизации ключевых префиксов и d
как индексированный столбец.
Вместо этого он ошибочно решил, что (b, d)
не образует префикс, поэтому он отбрасывается из кандидатов на оптимизацию без учета того, что d
имеет индекс.
Это упрощение будет исправлено, я создал проблему с трекером ошибок здесь: https://github.com/scylladb/scylla/issues/4178