私の質問は、[〜#〜] sql [〜#〜]のCTE
とView
の違いは何ですか?つまり、CTE
を使用する必要がある場合と、View
を使用する場合です。どちらもある種の仮想テーブルであることは知っていますが、それらの用途を区別することはできません。
同様の質問 here が見つかりましたが、パフォーマンスに関するものです。
更新1:
例:取引で満たされたデータベースがあります(_tbl_trade
_)。 350万件のレコードから、当月まで現在の時間までに開かれた取引のみを選択し、データを操作する必要があります(仮想テーブルでのさまざまなクエリを使用して、ビューのように見えます)。ここでの問題は、3〜4列のSUM
が必要なことと、いくつかの列をSUM
にして、結果(CTEのように見える)を持つ仮想列を作成する必要があることです。
例:_tbl_trade
_には列があります:profit
、bonus
およびexpenses
。 SUM(profit)
、SUM(bonus)
、SUM(expenses)
と、SUM(profit)
+ SUM(bonus)
+ SUM(expenses)
。
PS。 SUM
のクエリを再実行することは、すでに結果が得られているため、オプションではありません。
前もって感謝します!
ビューにはインデックスを付けることができますが、CTEはできません。これが重要なポイントの1つです。
CTEはtree hierarchy
i.e。再帰的
また、複雑なクエリを処理するときは、ビューを考慮してください。ビューはデータベース上の物理オブジェクトであり(ただし、データを物理的に保存するわけではありません)、複数のクエリで使用できるため、柔軟性と集中型のアプローチを提供します。一方、CTEは一時的なものであり、使用時に作成されます。それがinline view
と呼ばれる理由です。
更新
更新された質問によると、ビューは正しい選択です。 CTEで350万行を処理すると、TempDbに余分なオーバーヘッドが発生し、最終的にSQL Serverのパフォーマンスが低下します。 CTEは使い捨てのビューであるため、統計は保存されず、インデックスを作成することもできません。サブクエリのようなものです。
どちらもプランオプティマイザーによってまったく同じように解釈されます。それはただ違うものです。
ビューはそれ自体で使用できます。複雑なステートメントをより単純なクエリにカプセル化できます。
CTEは主に、たとえばプロシージャ/ビューの冗長性が少ない、よりクリーンなコードを記述するために使用されました。再帰クエリにもCTEを使用できます。これは非常に優れた強力な機能です。
これが明確にするのに役立つことを願っています。
CTEを選択する理由の1つ:階層クエリを実行する場合は、CTEを使用します。 CTEは再帰的に呼び出すことができます。ビューを再帰的に呼び出すことはできません。