SQL-запрос выполняется медленнее, чем ожидалось

У меня есть стол

foo(a1, a2, a3, a4, a5)

a1 является первичным ключом. есть некластеризованный индекс на a5,

У меня есть простой запрос:

SELECT * 
FROM foo
WHERE a5/100 = 20;

Этот запрос выполняется значительно медленнее. обновление статистики, используемой при планировании запросов, не сильно помогло.

Почему это может происходить? Что я могу делать не так? Я новичок в оптимизации запросов.

2 ответа

Решение

Вы используете выражение для столбца в предикате WHERE, поэтому оно не может быть sargable(не может использовать индекс).

Это оставляет в стороне возможную проблему кардинальности, то есть распределения данных - если ваши условия WHERE возвращают более 40% строки, индекс становится бесполезным.

РЕДАКТИРОВАТЬ

В индексе, в котором вы ищете значение, если это значение является результатом выражения, индекс не может быть использован. Также могут быть использованы операторы NOT, NOT IN,<>, так как для поиска по индексу вам нужно ясное значение (s) чтобы оптимизатор мог определить какой-то фиксированный диапазон. С вашими расчетами на лету значение постоянно меняется, поэтому вам нужно сканировать всю таблицу.

Вы можете создать индекс по выражениям вместо базовых данных. Если вы знаете, что всегда будете делить a5 на 100, вы можете сделать индекс с помощью:

CREATE INDEX ON foo ((a5/100));

Требуются дополнительные скобки.

Таким образом, любой запрос, который имеет WHERE a5/100 = <something> сможет воспользоваться индексом.

Это не поможет WHERE a5/99 = <something> и т.д. хотя

Документы на https://www.postgresql.org/docs/current/static/indexes-expressional.html

Другие вопросы по тегам