Почему оптимизация ключевого префикса не работает со вторичным индексом в столбце кластеризации? - PullRequest
0 голосов
/ 31 января 2019

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]= "Невозможно выполнить этот запрос, так как он может включать фильтрацию данных и, следовательно, может иметь непредсказуемую производительность. Если вы хотите выполнить этот запрос, несмотря на непредсказуемость производительности, используйте ALLOW FILTERING"

ScyllaDB 3.0.1.

1 Ответ

0 голосов
/ 01 февраля 2019

спасибо за нахождение интересного углового случая:)

Проблема в том, что второй запрос ограничивает кластеризацию столбцов (b, d), что само по себе не образует префикс ключа кластеризации.Конечно, d индексируется, поэтому для того, чтобы произошло , нужно использовать a в оптимизации префикса ключа и d в качестве индексированного столбца.

Вместо этого ошибочно решено, что (b, d) не образует префикс, поэтому он отбрасывается из кандидатов на оптимизацию, без учета того, что d имеет индекс.

Это упрощение будетисправлено, я создал проблему с трекером ошибок здесь: https://github.com/scylladb/scylla/issues/4178

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...