2016-10-18 2 views
0

Глядя на другие вопросы here on SO и Google, похоже, указывает, что MS Sql Server не гарантирует короткого замыкания выражений в предложении WHERE.Выполняет ли SQL короткое замыкание оценки OR в WHERE CLAUSE?

Означает ли это, что выражение WHERE, подобное этому, нельзя доверять работе ...?

... WHERE (@include_voided = 1 OR mytable.void = 0) AND ... 

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

... WHERE mytable.void = case when @include_voided=1 then mytable.void else 0 END 

... как все статьи, кажется, указывают, что утверждения СЛУЧАЙ являются единственными гарантированными кратко- цепи.

Я надеюсь, что первое выражение прекрасно, потому что оно более читаемо и легче набирать.

+0

Btw, вы получите разные результаты на '@include_voided = NULL'. Кроме того, вы не можете сделать эти условия поиска подходящими (т. Е. Нет способа поиска индекса здесь), поэтому используйте то, что удобнее писать. – wqw

ответ

3

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

А что касается оптимизации, это зависит от того, как построен ваш индекс. Это (в идеале) индекс стремится.

2

Ваш вопрос действительно не имеет никакого смысла. Ваш оператор case на самом деле более сложный, чем оригинал or. Что нужно сделать оригиналу or, чтобы оценить как выражения? Что-то вроде:

  • Сравнить параметр в 0
  • извлекает значение из записи
  • Сравните это с 0

только один из них действительно имеет какое-либо время, связанное с ним - выборки значение из записи, вероятно, связано с несколькими аппаратными операциями.

Что делает case нужно сделать:

  • извлекает значение из записи.
  • Сравнить параметр на 1
  • Сравните значение 0

Я не вижу, как это проще в любом случае.

В любом случае, ваша настоящая проблема заключается не в такой микро-оптимизации. Реальная проблема с производительностью заключается в том, может ли SQL-механизм использовать индексы для запроса. Использование or делает проблемы проблематичными. По этой причине вы можете рассмотреть динамический SQL, если производительность является основной проблемой, и у вас есть соответствующие индексы для разных возможных условий.

Смежные вопросы