@LordOfARing

Почему sql-оператор IN (в WHERE) плох с точки зрения оптимизации?

Объясните техническим языком, почему использование оператора IN (значение0, значение1, значение2) плохо сказывается на производительности SQL-запроса?

Как можно переписать запрос, чтобы он был менее ресурсозатратным (например вложенные запросы - рекомендуют выносить отдельно в WTH. А с IN?)
  • Вопрос задан
  • 244 просмотра
Решения вопроса 2
mayton2019
@mayton2019
Bigdata Engineer
Данный вопрос никак не решается в scope знаний об чистом языке SQL.
Здесь надо смотреть конкретную DBMS (Postgres/MySQL) и смотреть какой она выбрала план.

Более того. Знания о том как сработал Postgres нам не дают никакой подсказки о том как это сработает
в других системах.
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
в формате IN (значение0, значение1, значение2) неплох, оптимизатор это покажет
проблемы начинаются когда формат IN (SELECT ...)
лучше заменить EXISTS (хотя есть упоминания что одинаково) или классическим JOIN
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
Использование оператора IN (значение0, значение1, значение2) никак не сказывается на производительности SQL-запроса.
Чтобы запрос был менее ресурсозатратным, надо посмотреть результат EXPLAIN и расставить индексы.
Ответ написан
Комментировать
@gsaw
IN(1, 2, 4) не плох, если он постоянен. А если он от запроса к запросу меняется. В одном 3 значения к примеру, IN(A, B, C) а потом в следующем 2 значения IN(Z,V) то это разные запросы и оптимизатору надо под каждый такой запрос создавать свой план выполнения. Что может притормаживать выполнение запроса.

По крайней мере меня так учили. Может в современных базах лучше стало с этим. Может это мелочи по сравнению с мировой революцией, потому что запрос у вас на два часа.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы