2015-03-03 2 views
1

У меня очень длинный оператор CASE, и он делает запрос очень длинным. Есть ли альтернативный способ? Оказывает ли длинное заявление CASE на производительность? Я вижу, что люди рекомендуют COALESCE, но я не уверен, что это хорошая альтернатива в моем запросе.SQL Server: Альтернатива длинного оператора CASE

Пример, приведенный ниже, a, b, c, d, e, f являются столбцами таблицы, но я просто использую здесь букву, чтобы привести пример.

UPDATE table 
SET totalAmt = CASE 
       WHEN product_id = 1 THEN a*b*c*d 
       WHEN product_id = 2 THEN c*d*e + 1 
       WHEN product_id = 3 
        THEN 
        CASE WHEN term = 12 THEN b*c*d*e ELSE a*b*e*f END 
       WHEN product_id = 4 THEN a+b+c+d 
       etc..... 
       END 
FROM table 
+1

Влияние производительности выражения случае, вероятно, не то, о чем вам нужно беспокоиться. И 'coalesce()' - это просто выражение в сокращенном выражении. – shawnt00

+0

Вы уверены, что все случаи настолько просты, как вы изображаете? У меня такое чувство, что по крайней мере один из случаев и, возможно, множественный, также имеют в них выборные утверждения? –

ответ

3

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

Запрос может работать лучше с предложением WHERE-- если это возможно даже при длительном запросе.

Если таблица большая и индексируется идентификатором продукта, а запрос обновляет небольшое подмножество продуктов, вы можете получить лучшую производительность, разбирая запрос на отдельные запросы UPDATE на продукт_ид. В противном случае вы можете завершить сканирование таблицы на огромной таблице. Например:

UPDATE table SET totalAmt = a*b*c*d WHERE product_id = 1 
UPDATE table SET totalAmt = c*d*e + 1 WHERE product_id = 2 

Если все случаи зависят от product_id, то вы можете сократить синтаксис вроде этого:

CASE product_id 
    WHEN 1 THEN a*b*c*d 
    WHEN 2 THEN ... 
END 

Я рекомендовал бы использовать комментарии, чтобы сделать код более читаемым. Например, если продукты являются жестко запрограммированным набором известных идентификаторов, вы можете указать, что они собой представляют. Кроме того, это может помочь в будущем обслуживание кода, чтобы объяснить расчет:

UPDATE table 
SET totalAmt = 
    CASE WHEN product_id = 1 -- table 
    THEN a*b*c*d    -- some explanation of calculation 
    CASE WHEN product_id = 2 -- chair 
    THEN ... 
+0

Спасибо, Пол. Этот способ выглядит аккуратно. – angelcake

0

Есть ли альтернативный способ?

Обычно я бы рекомендовал таблицу поиска и JOIN, но это работает только с простой заменой (WHEN product_id = 1 THEN 'name'), а не вычислениями.

Вы также можете разбить это на шесть слов UPDATE с WHERE product_id = x, а затем проверить вышеперечисленные UPDATE и шесть отдельных для разницы в производительности. Хотя я не вижу никакой пользы, если мы не говорим о огромном количестве строк.

1

Если UPDATE не нужно запускать против каждой записи, вы можете использовать WHERE для фильтрации. Что касается вашего выражения CASE, ничего не приходит на ум, я вынул из вложенных CASE только из моих собственных предпочтений, но не думаю, что это имеет какое-либо влияние на производительность:

UPDATE table 
SET totalAmt = CASE WHEN product_id = 1 THEN a*b*c*d 
        WHEN product_id = 2 THEN c*d*e + 1 
        WHEN product_id = 3 AND term = 12 THEN b*c*d*e 
        WHEN product_id = 3 THEN a*b*e*f 
        WHEN product_id = 4 THEN a+b+c+d 
       etc..... 
       END 
FROM table 
WHERE product_id IN (1,2,3,4) 
+0

Я очень люблю вынимать вложенные 'CASE' заявления вроде этого. Возможно, стоит указать явно * почему * это работает, что '' CASE' -операции 'короткое замыкание', когда они имеют истинное условие. Вывод вложенных случаев может быть огромным благом для удобочитаемости, imo. –

+0

@ Харт, мне нравится, что ты показываешь мне. Это будет полезно. Благодарю. – angelcake

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