Почему запрос SQLite для двух проиндексированных столбцов такой медленный? - PullRequest
1 голос
/ 17 января 2020

У меня есть таблица с 65 миллионами строк, по которой я пытаюсь выполнить простой запрос. Таблица и индексы выглядят так:

CREATE TABLE E(
    x INTEGER,
    t INTEGER,
    e TEXT,
    A,B,C,D,E,F,G,H,I,
    PRIMARY KEY(x,t,e,I)
);
CREATE INDEX ET ON E(t);
CREATE INDEX EE ON E(e);

Запускаемый мной запрос выглядит следующим образом:

SELECT MAX(t), B, C FROM E WHERE e='G' AND t <= 9878901234;

Мне нужно выполнить эти запросы для тысяч различных значений t и ожидал, что каждый запрос будет выполняться в доли секунды. Однако выполнение вышеуказанного запроса занимает около 10 секунд!

Я попытался запустить план запроса, но получил только это:

0|0|0|SEARCH TABLE E USING INDEX EE (e=?)

Так что это должен использовать индекс. При бинарном поиске я бы ожидал, что в худшем случае будет только 26 тестов, что было бы довольно быстрым.

Почему мой запрос такой медленный?

1 Ответ

2 голосов
/ 17 января 2020

Каждая таблица в запросе может использовать один индекс. Поскольку ваше предложение WHERE рассматривает несколько столбцов, вы можете использовать многостолбцовый индекс. Для этого все, кроме последнего столбца, используемого в индексе, должны проверяться на равенство; последний использованный может быть использован для больше / меньше чем.

Итак:

CREATE INDEX e_idx_e_t ON E(e, t);

должен дать вам толчок.

Для дальнейшего чтения о том, как Sqlite использует индексы, документация Query Planner - хорошее введение.

Вы также смешиваете агрегирующую функцию (max(t)) и столбцы (B и C), которые не ' т часть группы. В случае Sqlite это означает, что он будет выбирать значения для B и C из строки с максимальным значением t; другие базы данных обычно выдают ошибку.

...