Как определить, в какой ситуации оптимальнее использовать подзапросы, а не соединения?
Доброго времени суток!
Обычно я делаю выбор между двумя этими механизмами ситуативно. Но хотелось бы формализовать этот выбор в виде некоторого набора правил. Оба этих механизма необходимы для объединения данных из нескольких таблиц.
Я пришел к выводу, что лучше использовать join's, вместо subqueries, везде, где это возможно. Объединения более читабельные, особенно когда решения требуют вложенных выражений. Также, есть мнение что джойны работают быстрее.
Подзапросы есть смысл использовать тогда, когда перед объединением данных необходимо их преобразовать (например, когда нужно сперва обработать данные при помощи агрегирующих функций после группировки, а затем отфильтровать их через WHERE) или, например, получить вырожденную таблицу или скаляр.
А что вы думаете на этот счет? Может вы выделили какие-либо определения, описывающие базовый подход при выборе между join и subqueries.
Тут нечего думать. Смотрите что показывает explain plan и меряйте время отклика.
SQL как язык - это чистая теория. То есть известен результат но неизвестно каким способом конкретная dbms его достигает. Операция explain будет зависеть от выбора dbms (Oracle, Postgres e.t.c) и будет по разному показывать реализацию алгоритма выборки для каждого select.
Спрогнозировать как будет выглядеть план сложно. Даже разные версии Oracle к примеру могут показать разный план на одном тексте запроса.
минимизации ресурса памяти и уменьшения или изъятия параллелизма
2. join лучше для
локальной базы
концентрации ресурсов на выполнении запроса
3. outer apply / lateral join позволяют использовать преимущества correlated subqueries и выбирать данные, существенные преимущества
минимизируются изменения логики выборки данных
часто удается вовлечь индексы в выборку, не обращая внимание на распределение данных внутри домена, когда рост количества таблиц вовлеченных в inner / outer join с различными срезами данных, ведет к отказу оптимизатора запросов использовать индексы