Вложенный запрос против JOINs - PullRequest
7 голосов
/ 31 июля 2010

whos может быть намного эффективнее, если я использую nestted subquery, JOINs Или, может быть, temp tables ... другой вопрос: в подзапросах, если я использую предложение IN дважды с одним и тем же запросом, его тоже следует выполнить дважды!например:

Select ...
From X 
Where Exists( Select 1  From Y Where Idx = Y.SomeColumn ) 
Or Exists( Select 1 From Y Idy = Y.SomeColumn )

сколько раз подзапрос SELECT * FROM Y мог быть выполнен в этом запросе!
и что, если я использую этот способ для этого:

With XX As
(
Select ...
From Y
)
Select ...
From X
Where Exists ( Select 1 From XX Where Idx = XX.SomeColumn )
Or Exists ( Select 1 From XX Where Idy = XX.SomeColumn )

спасибо :)

Ответы [ 4 ]

4 голосов
/ 01 августа 2010

Два запроса эквивалентны и должны давать идентичные планы. Это ошибочное мнение, что CTE компилируются только один раз, обеспечивая выигрыш в производительности. Нерекурсивные CTE являются просто синтаксическим сахаром для производных таблиц / встроенных представлений (IMO по ошибке называют подзапросами).

Во-вторых, JOINs против IN / EXISTS могут давать разные результаты. СОЕДИНЕНИЯ рискуют дублировать данные, если есть две или более подтверждающие записи. EXISTS лучше всего использовать, если есть повторяющиеся критерии, потому что он возвращает true при первом столкновении с критериями - делая его потенциально быстрее, чем IN или JOIN. При использовании EXISTS или IN нет риска дублирования данных.

2 голосов
/ 31 июля 2010

Используйте план выполнения в SQL Server Management Studio и убедитесь, что работает быстрее с вашей базой данных.

2 голосов
/ 31 июля 2010

Во-первых, ваш синтаксис, вероятно, неправильный. Таким образом, эти два формата будут выглядеть так:

Select ...
From X 
Where Exists( Select 1  From Y Where Idx = Y.SomeColumn ) 
    Or Exists( Select 1 From Y Idy = Y.SomeColumn )

И

With XX As
    (
    Select ...
    From Y
    )
Select ...
From X
Where Exists ( Select 1 From XX Where Idx = XX.SomeColumn )
    Or Exists ( Select 1 From XX Where Idy = XX.SomeColumn )

Обратите внимание на операторы Exists.Они не Where Col Exists(..., а просто Where Exists( ....

Во-вторых, эффективность и скорость будут зависеть от данных, статистики, индексов и, в конце концов, от того, что оптимизатор сможетсделать более эффективным.Таким образом, вам действительно нужно посмотреть на план выполнения, чтобы узнать, что быстрее.Теперь другая форма может быть:

Select ...
From X 
Where Exists    (
                Select 1  
                From Y 
                Where Idx = Y.SomeColumn 
                Union All
                Select 1
                From Y
                Where Idy = Y.SomeColumn
                ) 
0 голосов
/ 31 июля 2010

Объединения выполняются намного быстрее, чем другие сделанные вами предложения.

Объединения будут выполнять условие ВКЛ для каждой записи, тогда как при выполнении выбора с WHERE сначала будут извлекаться ВСЕ записи, затем выполняется фильтрация, что значительномедленнее.

Присоединяется полностью !!

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