2015-08-05 2 views
2

Выполнение некоторой настройки производительности на 3 системе сторонних поставщиков в MS SQL Server 2012.Почему саз в ИНЕКЕ для MS SQL Server

Они делают много где положение, как это:

WHERE 
(
    CASE 
     WHEN @searchID = '' THEN 1 
     WHEN ((C.SAPCustomerNumber = @searchID) OR (C.SAPCustomerNumber = @SapID)) THEN 1 
    ELSE 0 
    END = 1 
       ) 

За исключением путаницы в плане запроса, какая польза, если бы кто-нибудь был в случае 1 или 0 в предложении where?

Благодаря

+0

Я никогда не следовал этому образцу, но может быть проверка/безопасность? 0 будет оцениваться как false, что заставляет запрос возвращать 0 результатов. –

+0

Да, это странно - его можно изменить как '((C.SAPCustomerNumber = @searchID) ИЛИ (C.SAPCustomerNumber = @SapID) ИЛИ (@searchID = ''))'. Результат будет таким же, и он будет намного более читабельным. –

+0

Спасибо, просто хотел убедиться, что я чего-то не упустил. Это было легкое предложение CASE, есть намного хуже для настройки. :( –

ответ

4

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

Это, как правило, ошибка, и может быть заменена более простой логический логично, так как @Bogdan предложил в комментариях:

((C.SAPCustomerNumber = @searchID) OR (C.SAPCustomerNumber = @SapID) OR (@searchID = '')) 

Вторая причина этого может быть сделано, если кто-то пытается провести в жизнь порядок оценки предикатов . CASE документируется для оценки своих условий WHEN (при условии, что они являются скалярными выражениями, а не агрегатами). Я бы серьезно не рекомендовал, чтобы кто-то действительно писал такой код, хотя это, скорее всего, ошибочно принимается за первую форму. И даже если конкретный оценочный заказ лучше всего сегодня, с сегодняшними данными, кто скажет, будет ли он по-прежнему правильным завтра или через месяц или годы?


SQL не гарантирует порядок вычисления для WHERE предикатов в статье рассматриваются вообще, ни какой-либо форме короткого замыкания оценки. Оптимизатор, как правило, может свободно переупорядочивать предикаты - как в предложении WHERE, так и в статьях JOIN/ON - попытаться добиться общего результата как можно дешевле. Вы не должны, как правило, пытаться помешать этому.

Если он не выбирает наиболее эффективный план, это гораздо лучше фиксируется путем обновления/создания индексов и статистики или фактического форсирования определенного плана, а не использования CASE.

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