2015-05-28 3 views
2

Привет, я довольно новичок в MS SQL, поэтому простите меня, если я прошу что-то, что очень очевидно для других более опытных людей. Я могу написать запрос для получения данных несколькими способами для получения одних и тех же данных. Теперь у меня есть два SQL запросы X и Y, которые выглядят как следующийВыбор наилучшего SQL-запроса

(Запрос 1)

select column1, column2, column3 
from 
Table1 a 
inner join 
Table2 b on a.column1=b.column1 
where Condition1 and condition2 

EXCEPT 

(select column1, column2, column3 
from 
Table1 a 
inner join 
Table2 b on a.column1=b.column1 
where Condition3 
) 

(Запрос 2)

select column1, column2, column3 
from 
Table1 a 
inner join 
Table2 b on a.column1=b.column1 
where Condition1 and condition2 

And column1 Not in 
(select column1 
from 
Table1 a 
inner join 
Table2 b on a.column1=b.column1 
where Condition3 
) 

Они оба принимает одинаковое время и ориентировочную стоимость поддерева также имеет минимальная разница. Я не уверен, какой из них лучший вопрос и почему.

+0

Я бы ожидал, что запрос 2 будет немного лучше, поскольку он должен сравнивать меньше данных, чем запрос 1. Если ни один из столбцов не является основным ключом, тогда он будет достаточно умным, чтобы использовать только тот. – Magnus

+0

В каких столбцах (окнах) действуют условия? И какую таблицу вы выбираете? – jpw

+2

Также имейте в виду, что 'EXCEPT' включает неявный' DISTINCT'. Это означает, что дубликаты строк из левой таблицы будут удалены. Это не относится к запросу 2. – Magnus

ответ

1

Второй, кажется, имеет небольшой край на первом. Подзапрос во втором выбирает только один столбец, то есть column1. Если этот столбец проиндексирован, для SQL Server будет намного лучше запросить точность и скорость.

0

Что делать, если вы изменяете условия, как показано ниже?

select column1, column2, column3 
from 
Table1 a 
inner join 
Table2 b on a.column1=b.column1 
where Condition1 and condition2 and not condition 3 
2

КРОМЕ сравнивает все (парные) столбцы двух полных отбирают и возвращает различные строки из левого набора результатов, которые не присутствуют в правильном наборе результатов, в то время как НЕ В сравнивает два или более таблиц в соответствии к условиям, указанным в предложении WHERE в подзапросе после НЕ СУЩЕСТВУЕТ КНОПКУ и делает то же самое, но не возвращает отдельный набор результатов.

В КРОМЕ возвращает различные строки, тогда как NOT IN не возвращать различные значения. Если проанализировать план выполнения, вы поймете, что КРОМЕ запрос медленнее чем НЕ.

Оператор сортировки в EXCEPT стоит около 65% от общего времени выполнения.

Согласно этому Link, КРОМЕ можно переписать с помощью НЕ СУЩЕСТВУЕТ. (КРОМЕ ALL можно переписать с помощью ROW_NUMBER и НЕ EXISTS.)

Обратитесь к LINK для получения дополнительной информации.

+1

Спасибо за объяснение. Теперь все ясно. –