web-dev-qa-db-ja.com

CTEとTEMPテーブルの主な違いは何ですか?

CTE'sを使用する代わりにcommon table expressionstemp tables)を使用する利点はありますか。

両者の間でパフォーマンステストを実施しましたが、両者の間に大きな違いはありません。

CTE'Sを使用する長所と短所は何ですか?

19
GreatLakes07

おそらくCTEと一時テーブルの最大の違いは、CTEの実行範囲がsingleSELECT、INSERT、UPDATE、DELETE、またはCREATE VIEWステートメント。

基本的に、一時テーブルでできるように、CTEを再利用することはできません。

ドキュメント から

共通テーブル式(CTE)は、単一のSELECT、INSERT、UPDATE、DELETE、またはCREATE VIEWステートメントの実行スコープ内で定義される一時的な結果セットと考えることができます。 CTEは、オブジェクトとして保存されず、クエリの期間だけ持続するという点で、派生テーブルに似ています。派生テーブルとは異なり、CTEは自己参照することができ、同じクエリで複数回参照できます。

CTEは次の目的に使用できます。

  1. 再帰クエリを作成します。詳細については、「共通テーブル式を使用した再帰クエリ」を参照してください。

  2. ビューの一般的な使用が不要な場合は、ビューを置き換えます。つまり、定義をメタデータに保存する必要はありません。

  3. スカラー副選択から派生した列、または決定論的ではない関数または外部アクセスを持つ関数によるグループ化を有効にします。

  4. 同じステートメントで結果のテーブルを複数回参照します。

14
bastos.sergio

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
5
Sonu Rajpoot