CTE にするかしないか
-
26-09-2019 - |
質問
私はあまりにも長い間 SQL2000 にこだわってきたため、共通テーブル式についてはあまり触れてきませんでした。
私が出した答え ここ (#4025380) そして ここ (#4018793) 彼らはCTEを使用しなかったという点で流れに逆行しました。
再帰に関しては、これらが非常に便利であり、それらを使用することで大幅に簡素化できるクエリがいくつかあることは理解していますが、どの時点でそれらの使用が単なる軽薄なものになるのでしょうか?サブクエリや結合に比べてパフォーマンスに大きなメリットがありますか?本当にコードが簡素化され、保守しやすくなっているのでしょうか?
つまり、「より軽い」構文ではなく CTE を使用することが適切な場合は次のとおりです。
解決
次の場合は通常、通常のサブクエリではなく CTE を使用する必要があります。
- クエリには再帰が必要です(あなたが指摘したように)
- サブクエリが大きいか複雑です
- 含まれているクエリが大きいか複雑です
- サブクエリが繰り返されます (または、共通のサブクエリに対してさまざまな単純な操作を実行することで、少なくともいくつかのサブクエリを簡素化できます)。
つまり、うまく使用するとクエリが読みやすくなります。
他のヒント
個人的に、私は、彼らは、よりクリーンで読みやすいコードを生成することを考えます。例として、#4018793 上の鉱山にあなたの答えを比較A>。私たちは、本質的に同じことをしました。私は、CTEを使用して、あなたはしませんでした。
CTEのないあなたの答えます:
SELECT
course,
section,
grade,
gradeCount
FROM
table
INNER JOIN
(SELECT
grade,
Max(gradeCount) as MaxGradeCount
FROM
table
) MaxGrades
ON table.grade = MaxGrades.grade
AND table.gradeCount = MaxGrades.MaxGradeCount
ORDER BY
table.grade
CTEと私の答えます:
;with cteMaxGradeCount as (
select
grade,
max(gradeCount) as MaxGradeCount
from @Test
group by grade
)
select
t.course,
t.SECTION,
t.grade,
t.gradeCount
from cteMaxGradeCount c
inner join @Test t
on c.grade = t.grade
and c.MaxGradeCount = t.gradeCount
order by t.grade
これは、階層的/再帰的な問い合わせを除いて、シンタックスシュガーです。
ただし、再帰的に行うことができますすべてがあるべきではない - 日付世代再帰CTEを経由してやっと良くカーソルを超えました - 番号表のトリックがはるかに優れたスケール
。 CTEは再帰的なシナリオでは、より高速な結果が得られます。 CTEの結果を繰り返し、最終的な結果セットを取得するために使用されます。だから、あなたは間違いなく、パフォーマンスの改善を示すために起こっている、CTEであなたのwhere句または副問合せをとっているからです。
参考: http://msdn.microsoft.com/ EN-US /ライブラリ/ ms190766(V = SQL.105).aspxのの
はちょうどノートでは、多くのシナリオでは、一時テーブルは、CTEもその後、より良いパフォーマンスを提供します。
参考:のhttp://social.msdn .microsoft.com /フォーラム/ EN / TRANSACTSQL /スレッド/ d040d19d-016e-4a21-bf44-a0359fb3c7fbする