sql server " in " или " or " - самый быстрый

Ok, поэтому у меня есть запрос:

select distinct(a)
from mytable
where
b in (0,3)

что будет быстрее, выше или

select distinct(a)
from mytable
where
b = 0
or
b = 3

есть ли общее правило?

спасибо

3 ответов


и IN и OR сделает запрос для b = 0 затем один для b = 3, а затем выполните слияние для двух результирующих наборов и, наконец, отфильтруйте любые дубликаты.

С IN, дубликаты действительно не имеют смысла, потому что b не может быть 0 и 3, но дело в том, что IN будет преобразовано в b = 0 OR b = 3 и OR, копии do имеет смысла, потому что вы могли бы b = 0 OR a = 3, и если вы должны были присоединиться к два отдельных результирующих набора, вы можете получить дубликаты для каждой записи, которая соответствует обоим критериям.

таким образом, дубликат фильтрации всегда будет сделано, независимо от того, используете ли вы IN или OR. Однако, если вы знаете с самого начала, что у вас не будет дубликатов - что обычно происходит, когда вы используете IN - тогда вы можете получить некоторую производительность, используя UNION ALL, который не отфильтровывает дубликаты:

select distinct(a)
from mytable
where
b = 0

UNION ALL

select distinct(a)
from mytable
where
b = 3

насколько я знаю, IN превращается в OR. Так что представление то же самое. Просто более короткий способ написания.


надеюсь, в этом простом примере это не имеет никакого значения, какую версию вы используете (как оптимизатор запросов должен превратить их в эквивалентные запросы под капотом), однако есть шанс, что это будет зависеть от индексов, построенных на mytable. Я бы предложил запустить оба запроса в SQL Server Management Studio после включения "включить фактический план выполнения" и сравнить результаты, чтобы определить, какой запрос имеет наименьшую "стоимость" в вашем сценарий.

для этого:

  1. Поместите свои запросы в новое окно запросов SQL Sever Management Studio
  2. щелкните правой кнопкой мыши на окне в пространстве, которое вы ввели в
  3. Нажмите "Включить Фактический План Выполнения"
  4. запустите запрос, как обычно

нижняя" результаты "половина окна теперь будет иметь 3-ю вкладку, показывающую "план выполнения", который должен содержать две "блок-схемы", одну для первого запроса и еще один на секунду. Если эти два запроса идентичны, то Sql Server обработал эти два запроса как эквивалентные, и поэтому вы должны выбрать ту форму, которую предпочитаете вы и/или ваши коллеги.