Ваше примерное условие поиска:
Code = '1' OR Code = '2'
Это логическое выражение, которое само состоит из двух суббулевых выражений в сочетании с OR
.
В SQL логические выражения могут иметь три возможных значения истинности true
, false
, unknown
.
При объединении выражений с AND
или OR
таблицы истинности могут использоваться для расширения всех возможных результатов.Таблица истинности для OR
приведена ниже.
╔═════════╦══════╦═════════╦═════════╗
║ ║ TRUE ║ FALSE ║ UNKNOWN ║
╠═════════╬══════╬═════════╬═════════╣
║ TRUE ║ TRUE ║ TRUE ║ TRUE ║
║ FALSE ║ TRUE ║ FALSE ║ UNKNOWN ║
║ UNKNOWN ║ TRUE ║ UNKNOWN ║ UNKNOWN ║
╚═════════╩══════╩═════════╩═════════╝
Из рассмотрения таблицы выше видно, что если вы знаете, что одно из подвыражений является истинным, не имеет значения, какое значение имеет другое выражение,Значение общего комбинированного выражения по-прежнему будет true
, поэтому нет необходимости даже оценивать его.
SQL Server может выполнять оценку короткого замыкания, но это не гарантируетчто он будет .
Кроме того, он может разработать план выполнения, в котором два предиката даже не имеют отношения к совместной оценке.Потенциально может возникнуть план запроса в вопросе, который содержит оператор поиска по индексу с двумя запросами.Один в Code = '1'
и один в Code = '2'
.
Отдельная оценка предиката теперь может быть удалена из плана выполнения, поскольку гарантируется, что объединенные результаты этих поисков индекса будут соответствовать предложению WHERE
ипоэтому нет необходимости делать какие-либо дополнительные оценки предикатов, помимо того, что происходит в рамках этих поисков.