質問とその回答に応じて、いくつかのユーザー ID をフィルタリングするための 2 つのクエリがあります。
シナリオ
クエリ A は (元のバージョン):
SELECT userid
FROM mem..ProfileResult
WHERE ( ( QuestionID = 4
AND QuestionLabelID = 0
AND AnswerGroupID = 4
AND ResultValue = 1
)
OR ( QuestionID = 14
AND QuestionLabelID = 0
AND AnswerGroupID = 19
AND ResultValue = 3
)
OR ( QuestionID = 23
AND QuestionLabelID = 0
AND AnswerGroupID = 28
AND ( ResultValue & 16384 > 0 )
)
OR ( QuestionID = 17
AND QuestionLabelID = 0
AND AnswerGroupID = 22
AND ( ResultValue = 6
OR ResultValue = 19
OR ResultValue = 21
)
)
OR ( QuestionID = 50
AND QuestionLabelID = 0
AND AnswerGroupID = 51
AND ( ResultValue = 10
OR ResultValue = 41
)
)
)
GROUP BY userid
HAVING COUNT(*) = 5
「set statistics time on」と「set statistic io on」を使用して、CPU 時間と io パフォーマンスを確認します。
結果は次のとおりです。
CPU time = 47206 ms, elapsed time = 20655 ms.
Set 操作を使用してクエリ A を書き直し、クエリ B と名付けます。
SELECT userid
FROM ( SELECT userid
FROM mem..ProfileResult
WHERE QuestionID = 4
AND QuestionLabelID = 0
AND AnswerGroupID = 4
AND ResultValue = 1
INTERSECT
SELECT userid
FROM mem..ProfileResult
WHERE QuestionID = 14
AND QuestionLabelID = 0
AND AnswerGroupID = 19
AND ResultValue = 3
INTERSECT
SELECT userid
FROM mem..ProfileResult
WHERE QuestionID = 23
AND QuestionLabelID = 0
AND AnswerGroupID = 28
AND ( ResultValue & 16384 > 0 )
INTERSECT
SELECT userid
FROM mem..ProfileResult
WHERE QuestionID = 17
AND QuestionLabelID = 0
AND AnswerGroupID = 22
AND ( ResultValue = 6
OR ResultValue = 19
OR ResultValue = 21
)
INTERSECT
SELECT userid
FROM mem..ProfileResult
WHERE QuestionID = 50
AND QuestionLabelID = 0
AND AnswerGroupID = 51
AND ( ResultValue = 10
OR ResultValue = 41
)
) vv;
CPU 時間と経過時間は次のとおりです。
CPU time = 8480 ms, elapsed time = 18509 ms
私の簡単な分析
上の結果からわかるように、クエリ A は経過時間の 2 倍以上の CPU 時間を持っています。
私はこのケースを検索します。CPU 時間は、CPU がこのタスクを実行している時間の長さであるため、CPU 時間は経過時間よりも短くする必要があると言う人がほとんどです。また、経過時間には I/O 時間やその他の時間コストが含まれます。ただし、1 つの特別なケースは、サーバーに複数のコア CPU がある場合です。ただし、開発用の db サーバーを確認したところ、シングル コア CPU が 1 つあります。
質問1
シングル コア CPU 環境で、クエリ A の経過時間よりも長い CPU 時間を説明するにはどうすればよいですか?
質問2
集合演算を使ってみたら、本当に性能が向上したのでしょうか?
クエリ B の論理読み取りが 280627 であり、クエリ A の 241885 よりも高いため、この質問があります。
Brad McGehee氏は自身の記事で、「クエリによって実行される論理読み取りが少ないほど効率的であり、他のすべての条件が同じであると仮定すると実行速度が速くなります」と述べています。
よりも、クエリ B でさえクエリ A よりも高い論理読み取りを持っていると正しく言いますが、CPU 時間はクエリ A よりも大幅に少なく、クエリ B はパフォーマンスが優れているはずです。