Есть ли когда-нибудь в SQL случай, когда подзапрос более эффективен, чем объединение? - PullRequest
7 голосов
/ 21 марта 2011

Я видел, как люди гипотетически говорят, что есть случаи, когда подзапрос может быть более эффективным, чем объединение, но я никогда не видел хорошего примера этого?

Что было бы в случае, когда вы быхотите использовать подзапрос над объединением?

Ответы [ 2 ]

4 голосов
/ 21 марта 2011

Классическим примером является поиск строк в таблице, у которых нет соответствующих строк в другой.

SELECT a.*
    FROM TableA a
    WHERE NOT EXISTS(SELECT NULL FROM TableB b WHERE b.parent_id = a.id)

обычно лучше, чем

SELECT a.* 
    FROM TableA a
        LEFT JOIN TableB b
            ON a.id = b.parent_id
    WHERE b.parent_id IS NULL

См. Также: Левое внешнее соединение против НЕ СУЩЕСТВУЕТ

2 голосов
/ 21 марта 2011

При использовании EXISTS с подзапросом решение подзапроса должно быть быстрее (по сравнению с внешним соединением и проверкой на NULL), потому что «оценка» подзапроса завершается, как только возвращается первая строка .

По моему опыту, в большинстве случаев оптимизатор запросов выбирает один и тот же план, так что между ними нет разницы в производительности (по крайней мере, для Oracle и PostgreSQL)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...