Логические операторы или в условиях и порядок условий, где
-
16-10-2019 - |
Вопрос
Давайте рассмотрим эти два утверждения:
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 или условия, когда первый уже правда или M и условия, когда первый уже ложный.
Мы, как разработчики, должны знать, что SQL Server работает по -разному. Это система, основанная на затратах. Чтобы получить оптимальный план выполнения нашего запроса, процессор запроса должен оценить все, где условия, и назначать его стоимость. Эти затраты затем оцениваются в целом, чтобы сформировать порог, который должен быть ниже, чем определенный порог SQL Server для хорошего плана. Если стоимость ниже, чем определенный порог, используется план, если не весь процесс повторяется снова с другим сочетанием затрат на условия. Стоимость здесь-это либо сканирование, либо в поисках, либо объединении слияния, либо хэш-соединение и т. Д. Из-за этого короткое замыкание, которое доступно в C ++/C#/VB, просто невозможно. Вы можете подумать, что принуждение использования индекса в столбце считается коротким замыканием, но это не так. Это только заставляет использовать этот индекс, и с этим сокращает список возможных планов выполнения. Система все еще основана на стоимости.
Как разработчик, вы должны знать, что SQL Server не делает короткометражную, как это делается на других языках программирования, и вы ничего не можете сделать, чтобы заставить его.
Решение
В SQL Server нет гарантии, если или в какой заказ операторы будут обработаны в WHERE
пункт. Единственное выражение, которое позволяет оператором короткометражного CASE
-WHEN
. Анкет Следующее из ответа, который я разместил на Stackoverflow:
Как короткие замыкания SQL Server, где оценка условия
Это происходит, когда кажется, что это так, но не так, как вы сразу думаете.
Как разработчик вы должны знать, что SQL Server не делает короткие круги как это делается на других языках программирования и Вы ничего не можете сделать, чтобы заставить его.
Для получения дополнительной информации проверьте первую ссылку в приведенной выше записи в блоге, что приводит к другому блогу:
Последний вердикт? Ну, у меня еще нет этого, но, вероятно, можно с уверенностью сказать, что Единственный раз, когда вы можете убедиться, что конкретный короткий цикл-это когда вы выражаете несколько условий, когда в случае выражения случая. С стандартными логическими выражениями, оптимизатор будет перемещать вещи, поскольку он считает FIT на основе таблиц, индексов и данных, которые вы запрашиваете.
Другие советы
В T-SQL IF
Заявление может короткое замыкание, но Вы не можете полагаться на это оценивая выражения в порядке
SQL - это декларативный язык программирования. В отличие от, скажем, C ++, который императив язык программирования.
Т.е. вы можете сказать это какие Вы хотите в конечном итоге, но не можете диктовать как Результат выполняется, все зависит от двигателя.
Единственный истинный способ гарантировать «короткое замыкание» (или любой другой управление потоком) внутри WHERE
это использовать индексированные виды, временные таблицы и аналогичные механизмы.
Пса Вы также можете использовать подсказки плана выполнения (чтобы «намекнуть» двигатель, как выполнить запрос, который индексирует для их использования и как их использовать), просто подумал, что я должен упомянуть об этом, пока мы на этой теме ...
1)-или (любое или оба условия будет правдой)
Если условие 1 верно, то условие 2 также будет проверять, это может быть либо верным, либо ложным
-и (оба условия должны быть правдой)
Если условие 1 неверно, то условие 2 не будет проверено
Единственный способ контролировать, как условия в предложении, где можно использовать скобки, чтобы сгруппировать их вместе.
WHERE Col1 = 'Something' AND Col2 = 'Something' OR Col3 = 'Something' and Col4 = 'Something'
сильно отличается от
WHERE (Col1 = 'Something' AND Col2 = 'Something') OR (Col3 = 'Something' and Col4 = 'Something')