Включает ли современная СУБД логическую оценку короткого замыкания? - PullRequest
5 голосов
/ 05 августа 2011

Многие современные языки программирования имеют логическую оценку короткого замыкания, например:

if (x() OR y())

Если x() возвращает значение true, y() никогда не оценивается.

Имеет ли SQL в современных СУБД (SQL Server, Sybase, Oracle, DB2 и т. Д.) Это свойство?

В частности, если левая часть логического оператора имеет видлогическая константа, будет ли она короткозамкнутой?


Похожие: Все ли языки программирования имеют логическую оценку короткого замыкания?

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Говоря специально для SQL Server - вроде.

Порядок, в котором вы указываете свои операторы OR, не может гарантировать короткое замыкание, потому что оптимизатор может переупорядочивать их по желанию, если он чувствует лучшую производительностьтаким образом можно получить выгоды.

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

В следующей статье (которая ссылается на другие отличные обсуждения / ресурсы) есть больше на эту тему: http://weblogs.sqlteam.com/jeffs/archive/2008/02/22/sql-server-short-circuit.aspx

1 голос
/ 05 августа 2011

Да и нет.

(ниже относится исключительно к SQL Server)

Некоторые операторы замыкают накоротко, а некоторые нет. OR CAN короткое замыкание, но может не зависеть от порядка операций, выбранного механизмом запросов.

CASE (я считаю) на 100% гарантировано короткое замыкание.

Вы также можете попробовать установить порядок оценки с помощью вложенных скобок, например:

IF ((X) OR Y)

Но я не уверен, что это всегда также соответствует.

Проблема с SQL в этом отношении заключается в том, что он декларативный, а фактическая логика выполняется движком. На самом деле может оказаться более эффективным проверить сначала Y на вашем примере, а затем проверить X - если, например, Y проиндексирован и X требует сканирования таблицы.

Для справки:

Из документации ANSI-SQL из этого ответа:

Там, где приоритет не определяется форматами или скобки, эффективная оценка выражений, как правило, выполняется слева направо. Однако зависит от реализации оцениваются ли выражения слева направо, особенно когда операнды или операторы могут вызвать условия или если результаты выражений могут быть определены без оценивая все части выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...