2013-07-24 5 views
1

Я рефакторинг старого кода SQL коллег и заметил в нескольких местах предложение where формы where [SomeCol] in ('XYZ'). Я предполагаю, что это результат быстрой скопирования из других мест в коде с большим количеством значений в скобках (where [SomeCol] in ('ABC', 'DEF', 'XYZ')) и заменой их [SomeCol] = 'XYZ', даже если только для аккуратности.Любая разница между [col] in ('single element') и [col] = 'single element'?

Просто хотел быть абсолютно уверенным, хотя два утверждения функционально эквивалентны - я бы предположил, что [SomeCol] = 'XYZ' немного (скорее всего, нецелесообразно) более эффективно, но не хочу, чтобы узнать позже. Я спотыкаюсь о какой-то неясной функциональность, которая даст разные результаты.

+1

Взгляните на план выполнения. Для моих примеров это одно и то же. – makciook

+1

Они эквивалентны во всех отношениях. Никакой разницы в результатах и ​​никакой разницы в производительности. Если вы проверите план выполнения, вы увидите, что ваш '[SomeCol] in ('XYZ')' выполняется как '[SomeCol] = 'XYZ'', поэтому вы не измените его, изменив его. –

+2

@Kai. , , Единственное различие - ремонтопригодность. Если вы можете добавлять и удалять значения, тогда форма 'in' более безопасна. Вам не нужно беспокоиться о том, что кто-то меняет 'x = 'a' и y = 'c'' на' x =' a 'или x =' b 'и y =' c''. –

ответ

3

Они должны быть одинаковыми. Я иногда делал IN, когда у меня было одно значение с самого начала, но в будущем ожидалось, что могут потребоваться другие значения. Это упрощает добавление новых значений без изменения структуры оператора. Просто догадаться о «почему».

1

Они эквивалентны.

Для значений менее 63 в списке IN SQL Server расширяет список IN на несколько OR. Например,

[SomeCol] IN (1,2,3,4) 

будет evaulated, как

([SomeCol]=1 or [SomeCol]=2 or [SomeCol]=3 or [SomeCol]=4) 

Следовательно, в этом случае не было бы никаких ОШ и, следовательно, являются эквивалентными.

+2

У вас есть какие-либо изменения, откуда вы получили эту информацию? Меня очень интересовали бы статьи о внутренней работе оптимизатора запросов MSSQL, поэтому, если это общедоступный источник, ПОЖАЛУЙСТА, поделитесь ссылкой :-) –

+0

@PaulGroke - я не уверен, что он документально зарегистрирован. Но очевидно, что что-то вроде этого происходит, если вы пропустили «SomeCol» - вы получите одно сообщение об ошибке за элемент в «IN» –

+0

@Damien_The_Unbeliever - я уверен, что это артефакт анализатора и не говорит ничего о том, что оптимизатор запросов сделал бы с запросом, если бы он когда-либо видел его. –

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