web-dev-qa-db-ja.com

SQL-CTE対VIEW

私の質問は、[〜#〜] sql [〜#〜]CTEViewの違いは何ですか?つまり、CTEを使用する必要がある場合と、Viewを使用する場合です。どちらもある種の仮想テーブルであることは知っていますが、それらの用途を区別することはできません。

同様の質問 here が見つかりましたが、パフォーマンスに関するものです。

更新1:

例:取引で満たされたデータベースがあります(_tbl_trade_)。 350万件のレコードから、当月まで現在の時間までに開かれた取引のみを選択し、データを操作する必要があります(仮想テーブルでのさまざまなクエリを使用して、ビューのように見えます)。ここでの問題は、3〜4列のSUMが必要なことと、いくつかの列をSUMにして、結果(CTEのように見える)を持つ仮想列を作成する必要があることです。

例:_tbl_trade_には列があります:profitbonusおよびexpensesSUM(profit)SUM(bonus)SUM(expenses)と、SUM(profit) + SUM(bonus) + SUM(expenses)

PS。 SUMのクエリを再実行することは、すでに結果が得られているため、オプションではありません。

前もって感謝します!

14
BlackM

ビューにはインデックスを付けることができますが、CTEはできません。これが重要なポイントの1つです。

CTEはtree hierarchyi.e。再帰的

また、複雑なクエリを処理するときは、ビューを考慮してください。ビューはデータベース上の物理オブジェクトであり(ただし、データを物理的に保存するわけではありません)、複数のクエリで使用できるため、柔軟性と集中型のアプローチを提供します。一方、CTEは一時的なものであり、使用時に作成されます。それがinline viewと呼ばれる理由です。

更新

更新された質問によると、ビューは正しい選択です。 CTEで350万行を処理すると、TempDbに余分なオーバーヘッドが発生し、最終的にSQL Serverのパフォーマンスが低下します。 CTEは使い捨てのビューであるため、統計は保存されず、インデックスを作成することもできません。サブクエリのようなものです。

25
Anuj Tripathi

どちらもプランオプティマイザーによってまったく同じように解釈されます。それはただ違うものです。

ビューはそれ自体で使用できます。複雑なステートメントをより単純なクエリにカプセル化できます。

CTEは主に、たとえばプロシージャ/ビューの冗長性が少ない、よりクリーンなコードを記述するために使用されました。再帰クエリにもCTEを使用できます。これは非常に優れた強力な機能です。

これが明確にするのに役立つことを願っています。

8
Ionic

CTEを選択する理由の1つ:階層クエリを実行する場合は、CTEを使用します。 CTEは再帰的に呼び出すことができます。ビューを再帰的に呼び出すことはできません。

6
zedfoxus