CTE's
を使用する代わりにcommon table expressions
(temp tables
)を使用する利点はありますか。
両者の間でパフォーマンステストを実施しましたが、両者の間に大きな違いはありません。
CTE'S
を使用する長所と短所は何ですか?
おそらくCTEと一時テーブルの最大の違いは、CTEの実行範囲がsingleSELECT、INSERT、UPDATE、DELETE、またはCREATE VIEWステートメント。
基本的に、一時テーブルでできるように、CTEを再利用することはできません。
ドキュメント から
共通テーブル式(CTE)は、単一のSELECT、INSERT、UPDATE、DELETE、またはCREATE VIEWステートメントの実行スコープ内で定義される一時的な結果セットと考えることができます。 CTEは、オブジェクトとして保存されず、クエリの期間だけ持続するという点で、派生テーブルに似ています。派生テーブルとは異なり、CTEは自己参照することができ、同じクエリで複数回参照できます。
CTEは次の目的に使用できます。
再帰クエリを作成します。詳細については、「共通テーブル式を使用した再帰クエリ」を参照してください。
ビューの一般的な使用が不要な場合は、ビューを置き換えます。つまり、定義をメタデータに保存する必要はありません。
スカラー副選択から派生した列、または決定論的ではない関数または外部アクセスを持つ関数によるグループ化を有効にします。
同じステートメントで結果のテーブルを複数回参照します。
CTE: CTEは共通テーブル式を表します。 SQL Server 2005で導入されました。一時的なベースに複雑なサブクエリの結果を保存するために使用されます。その寿命は現在のクエリに限定されます。 WITHステートメントを使用して定義されます。主に再帰呼び出しに使用されます。
例
;with myCTE as
(
select ParentLevel, ParentID, ChildID
from MHA
where ChildID = 1
UNION ALL
select MHA.ParentLevel, MHA.ParentID, MHA.ChildID
from MHA
inner join myCTE on MHA.ParentID = myCTE.ChildID
where MHA.ParentID <> 0
)
(エラー)
select top (5) * from myCTE
したがって、上記の例では、上記のクエリでのみ使用できるmyCTEとしてCTE名を作成しています(上記のクエリの外側でmyCTEを使用することはできません)
TEMP:クエリの結果を一時的なベースに保存するためにも使用されますが、その有効期間は現在のセッションに制限されます。 #を使用して定義されます。再帰をサポートしていません。
例:
select * into #tempTable from MHA
上記のクエリでは、一時テーブルを作成しましたが、このクエリの一時テーブルをセッション内で使用できます。下記参照
(エラーなし)
select top (5) * from #tempTable