2011-01-05 2 views
6

Есть ли какие-либо различия (перфорация) Writting этот запрос:Есть ли разница между '=' и In?

Select * from T where PK = 1 

или это

Select * from T where PK in (1) 

Я считаю, что нет, но я действительно не знаю, как dispay план выполнения, который должен отстаивать свое чувство ,

Thx заранее

+1

Я надеюсь, что оптимизатор узнает, что в вашем списке 'IN' есть только одно значение, и обрабатывайте его так же, как и' = '. – LukeH

+0

Я тоже. Но как я могу это утверждать? –

ответ

3

ИН выражение:

Column in (Val1,Val2,Val3) 

внутренне переписан в нечто очень похожее на:

(Column = Val1 or Column = Val2 or Column = Val3) 

Вы можете сказать это, потому что, если вы указываете имя несуществующего колонки, количество зарегистрированных ошибок (Invalid Column name 'Blah') равно количеству значений в списке IN. Конечно, такое переписывание происходит только для списков литеральных значений. Подзапросы (как говорит @oezi) обрабатываются по-разному.


Конечно, эта конкретная оптимизация не документирована, и всегда предпочтительнее писать максимально понятный код.

Я не уверен, есть ли верхний предел, где он не будет выполнять это расширение - он обязательно сделает это до 100 значений в списке IN (и я не могу беспокоиться о том, чтобы ввести больше).

3

в вашем случае: нет никакой разницы

вообще: вы могли бы написать подзапрос или внутри фигурных скобок, и = потерпит неудачу, если что подзапрос возвращает более чем на 1 строку. Кроме того, вы можете написать (1,2) (который будет похож на подзаголовок, который возвращает 2 строки), где = тоже невозможно.

+0

Thx, я знаю, как использовать in и '='. Я просто задавался вопросом, есть ли разница в перфомансе –

-1

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

"Select * от Т, где ПК = 1"

будет преформ намного быстрее, чем:

"Select * от Т, где ПК в (1)"

такая же, как:

"SELECT Customer_Number, customer_name от клиента ГДЕ CUSTOMER_NUMBER между 1000 и 1004"

будет преформ намного быстрее, чем:

"SELECT Customer_Number, customer_name от клиента ГДЕ CUSTOMER_NUMBER в (1000, 1001, 1002, 1003, 1004)"

оптимизатор запросов может найти диапазон номеров значительно быстрее (используя BETWEEN), чем он может найти ряд чисел с использованием предложения IN.

+1

Хорошо, но как вы можете это пропустить? –

+0

Хорошо, Damien_The_Unbeliever был прав, я только что проверил в плане выполнения, что «Выберите * из T, где PK in (1)» выполняется/переводится как «Выбрать * из T, где PK = 1», что означает, что оптимизатор запросов выполнил свою работу. Подзапросы в разделе IN обрабатываются по-разному. – HABJAN

+0

Единственное, что может быть быстрее, если при анализе запроса. :-) – HABJAN

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