Логические операторы или в условиях и порядок условий, где

dba.stackexchange https://dba.stackexchange.com/questions/5333

Вопрос

Давайте рассмотрим эти два утверждения:

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 не делает короткие круги как это делается на других языках программирования и Вы ничего не можете сделать, чтобы заставить его.

Для получения дополнительной информации проверьте первую ссылку в приведенной выше записи в блоге, что приводит к другому блогу:

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')
Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top