2016-11-02 1 views
0

に影響を与えない、私はより良い次のクエリでは、背後に何が起こるか理解したい:どのように二CASE文がパフォーマンス

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 

ただ、より良いクエリを理解するために、それは合計で調査した結果を返します。 「はい」と答えます。

注:CASEステートメントは単一のデータ型のみを返すことができ、NULLを返す代わりにN/Aを返すため、CASTを実行しています。 だから私の質問は、この行(ELSEで)んされています

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

は、実際には2回実行しますか?実行計画によれば、それには別の計算スカラー演算がありますが、それはちょうどWHENステートメントの最初のチェックでまったく同じチェックをしたのでキャッシュを使用していますか?

このシナリオを以前に持っていて、クエリのパフォーマンスへの影響を知りたいのではないかと疑問に思っています。

+0

この行は 'SUM(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

私のクエリが表示されたらデータはありません。そのケースを実行します... 2回、あなたの問題を解決します。興味深いことに実行計画は同じです。しかし、私はあなたのものをむしろもっと使いやすくなります。おかげで – EaziLuizi

1

まず、CASE文で "ELSE NULL"と言う必要はありません。デフォルトの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

関連する問題