@Xveeder

Как определить, в какой ситуации оптимальнее использовать подзапросы, а не соединения?

Доброго времени суток!

Обычно я делаю выбор между двумя этими механизмами ситуативно. Но хотелось бы формализовать этот выбор в виде некоторого набора правил. Оба этих механизма необходимы для объединения данных из нескольких таблиц.

Я пришел к выводу, что лучше использовать join's, вместо subqueries, везде, где это возможно. Объединения более читабельные, особенно когда решения требуют вложенных выражений. Также, есть мнение что джойны работают быстрее.

Подзапросы есть смысл использовать тогда, когда перед объединением данных необходимо их преобразовать (например, когда нужно сперва обработать данные при помощи агрегирующих функций после группировки, а затем отфильтровать их через WHERE) или, например, получить вырожденную таблицу или скаляр.

А что вы думаете на этот счет? Может вы выделили какие-либо определения, описывающие базовый подход при выборе между join и subqueries.
  • Вопрос задан
  • 52 просмотра
Решения вопроса 1
@mayton2019
Bigdata Engineer
Тут нечего думать. Смотрите что показывает explain plan и меряйте время отклика.

SQL как язык - это чистая теория. То есть известен результат но неизвестно каким способом конкретная dbms его достигает. Операция explain будет зависеть от выбора dbms (Oracle, Postgres e.t.c) и будет по разному показывать реализацию алгоритма выборки для каждого select.

Спрогнозировать как будет выглядеть план сложно. Даже разные версии Oracle к примеру могут показать разный план на одном тексте запроса.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Miron11
Пишу sql 20 лет. Срок :)
1. подзапросы типа exists лучше для
  • распределенных баз
  • минимизации ресурса памяти и уменьшения или изъятия параллелизма

2. join лучше для
  • локальной базы
  • концентрации ресурсов на выполнении запроса

3. outer apply / lateral join позволяют использовать преимущества correlated subqueries и выбирать данные, существенные преимущества
  • минимизируются изменения логики выборки данных
  • часто удается вовлечь индексы в выборку, не обращая внимание на распределение данных внутри домена, когда рост количества таблиц вовлеченных в inner / outer join с различными срезами данных, ведет к отказу оптимизатора запросов использовать индексы
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы