Обновление дела SQL Server - PullRequest
0 голосов
/ 23 июня 2019

У меня есть следующий запрос, и я пытаюсь понять, насколько хорошо написано, могу ли я иметь наилучшую возможную производительность

UPDATE UserSession 
SET
    PauseSpan = CASE State WHEN 9 THEN PauseSpan + @SPAN ELSE PauseSpan END, 
    PauseSpanTotal = CASE State WHEN 9 THEN PauseSpanTotal + @SPAN ELSE PauseSpanTotal END,
    PendSpan = CASE State WHEN 5 THEN PendSpan + @SPAN ELSE PendSpan END, 
    PendSpanTotal = CASE State WHEN 5 THEN PendSpanTotal + @SPAN ELSE PendSpanTotal END
WHERE State = 9 OR State = 5

Как видите, оператор WHERE вызовет фильтрацию двух типов записей с состояниями 9 и 5.

Поскольку некоторые из операторов CASE не будут удовлетворены, поведение ELSE по умолчанию приведет к тому, что результатом будет значение NULL, и оператор потерпит неудачу, так как рассматриваемые столбцы не обнуляются.

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

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

Ответы [ 2 ]

0 голосов
/ 23 июня 2019

Я сомневаюсь, что SQL Server будет тратить время, переопределяя значение на то же значение, но есть простой способ выяснить это.Запустите что-то вроде этого:

update UserSession
set PauseSpan = PauseSpan;

и посмотрите, сколько строк затронуто.Если это число равно 0, то обновление не будет переопределять само значение.Если это число совпадает с числом записей, обновление обновляет значение на себя

РЕДАКТИРОВАТЬ

Поскольку затрагиваются все записи, это влияет на производительность, но не следует беспокоиться об этом, пока производительностьстановится проблемой.

0 голосов
/ 23 июня 2019

Я бы сформулировал это, используя IN в предложении WHERE:

UPDATE UserSession 
    SET PauseSpan = (CASE State WHEN 9 THEN PauseSpan + @SPAN ELSE PauseSpan END) 
        PauseSpanTotal = (CASE State WHEN 9 THEN PauseSpanTotal + @SPAN ELSE PauseSpanTotal END),
        PendSpan = (CASE State WHEN 5 THEN PendSpan + @SPAN ELSE PendSpan END), 
        PendSpanTotal = (CASE State WHEN 5 THEN PendSpanTotal + @SPAN ELSE PendSpanTotal END)
WHERE State IN (5, 9);

Это не влияет на производительность. Единственное, что вы можете сделать с точки зрения производительности, - это добавить индекс на (State). Однако, если многие строки имеют состояния 5 и 9, это не будет иметь большого значения.

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