Операторы запросов SQL Server OR и AND являются коммутативными.Не существует собственного порядка, и оптимизатор запросов может свободно выбирать путь с наименьшими затратами для начала оценки.Как только план установлен, другая часть не оценивается, если результат предопределен.
Это знание допускает запросы типа
select * from master..spt_values
where (type = 'P' or 1=@param1)
and (1=@param2 or number < 1000)
option (recompile)
, где схема оценки гарантирована для короткого замыканиякогда @param установлен в 1. Этот шаблон типичен для дополнительных фильтров.Обратите внимание, что не имеет значения, проверяются ли @params до или после другой части.
Если вы очень хорошо разбираетесь в SQL и точно знаете, что запрос лучше всего выполнить по определенному плану, вы можетеВ SQL Server используются операторы CASE, которые всегда оцениваются во вложенном порядке.Приведенный ниже пример заставит type='P'
к всегда вычисляться первым.
select *
from master..spt_values
where
case when type='P' then
case when number < 100 then 1
end end = 1
Если вы не верите порядку оценки последнего запроса, попробуйте это
select *
from master..spt_values
where
case when type='P' then
case when number < 0 then
case when 1/0=1 then 1
end end end = 1
Несмотря на то, что константы в выражении 1/0=1
являются наименьшей стоимостью для оценки, они НИКОГДА не оцениваются - в противном случае запрос привел бы к делению на ноль вместо того, чтобы не возвращать строки (в master нет строк)..spt_values, соответствующие обоим условиям).