2011-12-15 4 views
2

Можно создать дубликат:
SQL Server - Query Short-Circuiting?
Is the SQL WHERE clause short-circuit evaluated?Производительность ИЛИ?

У меня есть вопрос о выполнении логического ИЛИ операторов T-SQL (SQL Server 2005).

Я искал вокруг немного, но я ничего не мог найти по этому вопросу.

Если у вас есть следующий запрос:

SELECT * FROM Table WHERE (randomboolean OR HeavyToEvaluateCondition) 

Не будет ли переводчик процедура идти так далеко, как randomboolean и пропустить оценку тяжелых условиях, чтобы сохранить эффективность, учитывая, что первое условие истинно?

Поскольку одно из значений в операторе OR истинно, было бы необязательно оценивать второе условие, так как мы уже знаем, что выполнено первое условие!

Я знаю, что это работает на C#, но я хочу знать, могу ли я рассчитывать на него в T-SQL тоже.

+0

http://stackoverflow.com/questions/789231/is-the-sql-where-clause-short-circuit-оцененный – AakashM

ответ

5

You can't count on short circuit evaluation in TSQL.

Оптимизатор может свободно оценивать условия, в которых когда-либо заказывали его, и в некоторых случаях может оценивать обе части выражения, даже если вторая оценка не может изменить результат выражения (Example).

Это не сказать никогда не делает оценка короткого замыкания. Вы можете получить начальный предикат на дорогостоящем условии, чтобы он выполнялся только при необходимости.

Кроме того, наличие в вашем запросе OR может преобразовать условие поиска в неблагоприятное положение, что означает, что индексы не используются оптимально. Особенно в SQL Server 2005 (в 2008 году OPTION (RECOMPILE) может помочь здесь).

Например, сравните планы на следующее. Версия с OR заканчивается полным сканированием индекса, а не индексом.

DECLARE @number INT; 
SET number = 0; 

SELECT COUNT(*) 
FROM master..spt_values 
WHERE @number IS NULL OR number = 0 

SELECT COUNT(*) 
FROM master..spt_values 
WHERE number = 0 

Plan

+1

. Стоит объяснить, что многое из этого связано с параллелизмом - SQL Server проверяет оба условия в одно и то же время в отдельных потоках, что еще более эффективно, чем проверка самого короткого в первую очередь. – JNK

+0

означает, что оценка второго условия заканчивается, если первый выполняется для оценки перед другим? – DOOMDUDEMX

+1

@JNK - Хорошо, что он может оценивать эти выражения параллельно. Даже по серийным планам, хотя он все равно может без необходимости оценивать все вспомогательные выражения. –

1

Его называют короткозамкнутым. И да, SQL Server делает это в определенных случаях. В каком порядке зависит от многих факторов и составляет часть оптимизации плана выполнения.

Однако есть подробности в Интернете, что это limitted ВСТУПИТЬ условия, заявления и т.д. случае

Смотрите эту SO сообщение ... SQL Server - Query Short-Circuiting?

+0

short-circuiting обычный относится к форме, где предикаты оцениваются в строгом порядке, пока времени, так как весь результат известен, и тогда никакие другие предикаты не оцениваются (например, оценка слева направо). Но, как вы заметили, порядок, в котором предикаты оцениваются в SQL, строго не определен, поэтому я бы не описал его поведение как короткое замыкание –

-4

Во-первых, где выполняется условие, чем OR оператор выполняется, когда управление переходит к первому condition.if первое условие истинно, чем это не проверить второе условие .if вы получаете 100 состояние и в этом случае первое условие ложно, а затем проверяет следующее условие.

+3

-1 SQL Server не гарантирует оценку слева направо, как вы предлагаете. –

+2

Не может быть более ошибочным ... – JNK

+4

@JNK - Конечно, он мог ... Во-первых, синтаксический анализ запроса и количество символов в каждом условии определяет порядок оценки ... SQL предпочитает фиолетовый, поэтому выражение, ближайшее к этот цвет всегда оценивает сначала ... Недавние тесты на LHC показывают, что определенная информация может перемещаться быстрее, чем свет, поэтому оптимизатор отправляет результаты назад вовремя, чтобы повторно информировать себя о наиболее эффективном плане выполнения. – MatBailie

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