ИЛИ короткое замыкание оператора в SQL Server - программирование
Подтвердить что ты не робот

ИЛИ короткое замыкание оператора в SQL Server

Я хочу обратиться к SQL Server ИЛИ короткому замыканию

Код:

   DECLARE @tempTable table
      (
         id int
      )
      INSERT @tempTable(id) values(1)

      DECLARE @id varchar(10)
      SET @id = 'x'
      SELECT * FROM @tempTable WHERE 1=1 OR id = @id --successfully
      SELECT * FROM @tempTable WHERE @id = 'x' OR id = @id --Exception not Convert 'x' to int

Почему? 1 = 1 и @id = 'x' истинно.

Оператор SQL Server OR: есть ли функция короткого замыкания?

спасибо

4b9b3361

Ответ 1

Внутри SQL там не требуется, что предложение OR рано ломается. Другими словами, оптимизатор должен проверять оба условия одновременно. Я не эксперт в оптимизаторе MSSQL, но я видел экземпляры, в которых оптимизатор имеет и не замыкал короткое замыкание предложения OR.

Ответ 2

Просто наткнулся на этот вопрос и уже нашел эту запись в блоге: http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/

SQL-сервер может оптимизировать запрос везде, где он сочтет нужным, поэтому в примере, приведенном в сообщении в блоге, вы не можете рассчитывать на короткое замыкание.

Однако CASE, по-видимому, документируется для оценки в письменном порядке - проверьте комментарии этого сообщения в блоге.

Ответ 3

Очевидно, что сервер MS Sql поддерживает теорию коротких замыканий, чтобы повысить производительность, избегая ненужной проверки,

Поддерживающий пример:

SELECT 'TEST'
WHERE 1 = 'A'

SELECT 'TEST'
WHERE 1 = 1 OR 1 = 'A'

Здесь первый пример приведет к ошибке "Ошибка конверсии при преобразовании значения varchar" A "в тип данных int. '

В то время как вторая выполняется легко, так как условие 1 = 1 оценивается как ИСТИНА, и, следовательно, второе условие не работает вообще.

Далее

SELECT 'TEST'
WHERE 1 = 0 OR 1 = 'A'

здесь первое условие будет оцениваться как ложное, и, следовательно, СУБД пойдет на второе условие и снова вы получите ошибку преобразования, как в приведенном выше примере.

ПРИМЕЧАНИЕ. Я РАЗРУШАЮЩИЙ УСЛОВИЕ ТОЛЬКО ДЛЯ РЕАЛИЗИРОВАНИЯ ПОГОДЫ СОСТОЯНИЕ ВЫПОЛНИТСЯ ИЛИ КРАТКОСРОЧНО ЕСЛИ РЕЗУЛЬТАТЫ QUERY В ОШИБКЕ СОХРАНЯЮТ СОСТОЯНИЕ, ВЫПОЛНЕННОЕ, КОРОТКО-ЦИРКУЛИРОВАННОЕ ИНОЕ.

ПРОСТОЕ ОБЪЯСНЕНИЕ

Рассмотрим,

WHERE 1 = 1 OR 2 = 2

поскольку первое условие оценивается как TRUE, его бессмысленно оценивать второе условие, потому что его оценка в любом значении не повлияет на результат вообще, поэтому его хорошая возможность для Sql Server сохранить время выполнения запроса, пропустив ненужную проверку состояния или оценку.

в случае "ИЛИ" , если первое условие оценивается как ИСТИНА, вся цепочка, связанная "ИЛИ" , считается оцененной как true, не оценивая других.

condition1 OR condition2 OR ..... OR conditionN

если условие 1 оценивается как истинное, оставим все условия до тех пор, пока условие N не будет пропущено. В обобщенных словах при определении первого TRUE все остальные условия, связанные с OR, будут пропущены.

Рассмотрим второе условие

WHERE 1 = 0 AND 1 = 1

поскольку первое условие получает evalutated до FALSE его бессмысленно оценивать второе условие, потому что его оценка в любом значении не повлияет на результат вообще, поэтому снова его хорошая возможность для Sql Server сохранить время выполнения запроса, пропустив ненужную проверку состояния или оценку.

в случае "И" , если первое условие оценивается как ЛОЖЬ, вся цепочка, связанная с "И" , считается оцененной к FALSE без оценки других.

condition1 AND condition2 AND ..... conditionN

если условие 1 оценивается как FALSE, остальные условия сохраняются до тех пор, пока условиеN не будет пропущено. В обобщенных словах при определении первого FALSE все остальные условия, связанные с И, будут пропущены.

ПОЭТОМУ, ПРОСТРАНСТВУЮЩИЙ ПРОГРАММА ДОЛЖНА ВСЕГДА ПРОГРАММА СЕТИ УСЛОВИЙ В ТАКОЙ ПУТЬ, ЧТО, МЕНЕЕ РАСПРОСТРАНЕННОЕ ИЛИ НАИБОЛЕЕ ЛИКВИДАЦИОННОЕ СОСТОЯНИЕ ПОЛУЧАЕТ ОЦЕНКУ ПЕРВОГО, ИЛИ СОХРАНЯЙТЕ СОСТОЯНИЕ В ТАКОЙ ПУТЕМ, КОТОРЫЙ МОЖЕТ ПРИНЯТЬ МАКСИМАЛЬНОЕ ПРЕИМУЩЕСТВО КОРОТКОГО ЦЕПЬ

Спасибо и с уважением,

Rk_Hirpara