Давайте рассмотрим эти два утверждения:
IF (CONDITION 1) OR (CONDITION 2)
...
IF (CONDITION 3) AND (CONDITION 4)
...
Если CONDITION 1
есть TRUE
, будет CONDITION 2
проверено?
Если CONDITION 3
есть FALSE
, будет CONDITION 4
проверено?
Как насчет условий на WHERE
: оптимизирует ли ядро SQL Server все условия в WHERE
предложении? Должны ли программисты располагать условия в правильном порядке, чтобы быть уверенным, что оптимизатор SQL Server разрешает их правильным образом?
ДОБАВЛЕНО:
Спасибо Джеку за ссылку, сюрприз от кода t-sql:
IF 1/0 = 1 OR 1 = 1
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
IF 1/0 = 1 AND 1 = 0
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
В этом случае исключение деления на ноль не возникает .
ВЫВОД:
Если C ++ / C # / VB имеет короткое замыкание, почему SQL Server не может его иметь?
Чтобы действительно ответить на этот вопрос, давайте посмотрим, как оба работают с условиями. C ++ / C # / VB имеют короткое замыкание, определенное в спецификациях языка для ускорения выполнения кода. Зачем оценивать условия N ИЛИ, если первое уже верно, или условия М И, когда первое уже ложно.
Мы, как разработчики, должны осознавать, что SQL Server работает по-другому. Это система, основанная на затратах. Чтобы получить оптимальный план выполнения для нашего запроса, обработчик запросов должен оценить каждое условие и назначить ему стоимость. Затем эти затраты оцениваются как единое целое, чтобы сформировать порог, который должен быть ниже, чем определенный порог, который имеет SQL Server для хорошего плана. Если стоимость ниже определенного порога, используется план, если не весь процесс повторяется снова с другим сочетанием затрат на условия. Стоимость здесь - это либо сканирование, либо поиск, либо соединение слиянием, либо хеш-соединение и т. Д. Из-за этого короткое замыкание, как это доступно в C ++ / C # / VB, просто невозможно. Вы можете подумать, что принудительное использование индекса для столбца считается коротким замыканием, но это не так. Это только заставляет использовать этот индекс и тем самым сокращает список возможных планов выполнения. Система по-прежнему основана на стоимости.
Как разработчик, вы должны знать, что SQL Server не замыкает накоротко, как это делается в других языках программирования, и вы ничего не можете сделать, чтобы его заставить.