2016-11-02 5 views
0

Я хочу, чтобы лучше понять, что происходит за кулисами, в следующем запросе:Каким образом второе утверждение СЛУЧАЙ влияет на производительность

SELECT s.Question_Id, s.Question, 
CASE WHEN 
    (SUM(CASE WHEN sr.Answer = 1 THEN 1 WHEN sr.Answer = 0 THEN 0 ELSE NULL END) 
    ) IS NULL THEN 'N/A' 
    ELSE CAST(SUM(CASE WHEN sr.Answer = 1 THEN 1 WHEN sr.Answer = 0 THEN 0 ELSE NULL END) AS VARCHAR) END   
    AS Answered_Yes 
FROM SurveyResult sr 
INNER JOIN Survey s 
ON sr.Question_Id = s.Question_Id 
GROUP BY s.Question_Id, s.Question 

Просто, чтобы лучше понять запрос, он возвращает результаты обследований с суммой «Да» ответы.

Примечание: Я делаю CAST потому что CASE оператор может возвращать только один тип данных, и вместо того, чтобы вернуться NULL, я хочу вернуть N/A. Так что мой вопрос делает эту линию (в ELSE):

CASE WHEN sr.Answer = 1 THEN 1 WHEN sr.Answer = 0 THEN 0 ELSE NULL END 

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

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

+0

Не совсем. Эта строка: 'SUM (CASE WHEN sr.Answer = 1 THEN 1 WHEN sr.Answer = 0 THEN 0 ELSE NULL END)'. Я не думаю, что SQL Server достаточно умен, чтобы оптимизировать это, хотя я могу ошибаться. –

+0

Отметьте кастинг в varchar без указания длины (будет varchar (1)) –

ответ

2

не уверен дополнительный скалярный оператор в плане выполнения, но ваш запрос может быть упрощен, как этот

SELECT s.Question_Id, 
     s.Question, 
     Isnull(cast(Sum(CASE sr.Answer 
         WHEN 1 THEN 1 
         WHEN 0 THEN 0 
        ELSE NULL 
        END) as varchar(100)), 'N/A') AS Answered_Yes 
FROM SurveyResult sr 
     INNER JOIN Survey s 
       ON sr.Question_Id = s.Question_Id 
GROUP BY s.Question_Id, 
      s.Question 

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

+0

+1 Блестящий, спасибо, это намного проще и избежать дублирующего заявления CASE, просто по-прежнему любопытно, как он обрабатывает этот дубликат ... Цените помощь! – EaziLuizi

+0

@EaziLuizi - Что вы подразумеваете под дубликатами? вы можете добавить пример данных и ожидаемый результат. –

+0

Нет данных, если вы видите мой запрос, я выполняю этот CASE ... КОГДА дважды, поэтому ваш решает эту проблему, интересно, хотя план выполнения идентичен. Но я предпочел бы использовать ваши, БОЛЬШЕ читабельнее. Спасибо – EaziLuizi

1

Во-первых, вам никогда не нужно говорить «ELSE NULL» в заявлении CASE; поведение ELSE по умолчанию - вернуть значение NULL. Затем, если SurveyResult.Answer может быть только 1 или 0, то ваш запрос может быть дополнительно упрощен следующим образом:

SELECT s.Question_Id, 
     s.Question, 
     Isnull(cast(Sum(sr.answer) as varchar(100)), 'N/A') AS Answered_Yes 
FROM SurveyResult sr 
INNER JOIN Survey s 
    ON sr.Question_Id = s.Question_Id 
GROUP BY s.Question_Id, s.Question 
+1

+1 Спасибо, Вот почему я люблю задавать вопросы, изучать новые вещи, как поведение ELSE по умолчанию возвращает NULL. – EaziLuizi

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

  • Нет связанных вопросов^_^