ЕСЛИ СУЩЕСТВУЕТ в T-SQL - PullRequest
       37

ЕСЛИ СУЩЕСТВУЕТ в T-SQL

44 голосов
/ 07 сентября 2011

Если у нас есть SELECT инструкция внутри IF EXISTS, останавливается ли выполнение, как только он находит запись в таблице? Например:

IF EXISTS(SELECT *  FROM  table1  WHERE Name='John' )

return 1

else

return 0

Если в таблице существует строка с именем = John, останавливает ли она выполнение и возвращает 1 или проходит через всю таблицу в поисках дополнительных совпадений?

Ответы [ 2 ]

49 голосов
/ 07 сентября 2011

Да, это останавливает выполнение, поэтому обычно предпочтительнее, чем HAVING COUNT(*) > 0, что часто не происходит.

С EXISTS если вы посмотрите на план выполнения, вы увидите, что фактическое число строк, выходящих из table1, не будет больше 1 независимо от количества совпадающих записей.

В некоторых случаях SQL Server может преобразовать дерево для запроса COUNT в такое же, как и для EXISTS на этапе упрощения (с полусоединением и без оператора агрегирования в поле зрения) пример это обсуждается в комментариях здесь .

Для более сложных поддеревьев, чем показано в вопросе, вы можете иногда обнаружить, что COUNT работает лучше, чем EXISTS. Поскольку для полусоединения требуется извлечь только одну строку из поддерева, это может побудить план с вложенными циклами для этой части дерева - что может не сработать оптимально на практике.

0 голосов
/ 20 января 2016

В этом случае нет необходимости использовать «else»:

IF EXISTS(SELECT *  FROM  table1  WHERE Name='John' ) return 1
return 0
...