2010-07-30 3 views
7

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

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) 

Thanx :)

ответ

4

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

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

+0

thanx много человек :) – Rawhi

0

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

Соединения будут выполнять условие ВКЛЮЧЕНИЯ для каждой записи, тогда как выполнение выбора с помощью ГДЕ сначала выберет ВСЕ записи, затем выполнит фильтр, тем самым будет намного медленнее.

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

+0

, но если я буду использовать с ним отчетливо, он не будет так быстро, как другие. – Rawhi

+0

@Paul Curses, ты избил меня. –

+0

AHA ....... !!!! – Rawhi

2

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

+0

Я попытался скачать его, но я не смог hh !! – Rawhi

+0

Экспресс-версия легко доступна и обычно работает: http: // www.microsoft.com/downloads/details.aspx?familyid=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796&displaylang=en –

2

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

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

thanx .......: D – Rawhi

Смежные вопросы