2011-08-09 11 views
4

クライアントのデータベース管理者は、レポートストアドプロシージャ(#Table)内で一時テーブルを使用せず、テーブル変数を使用するように要求しています。SQL Serverの一時テーブルとテーブル変数

テーブル変数の方が一時テーブルより効率が悪いですか? ##tableとは対照的に、私は、#tableとしてテーブルを作成する場合は、右、グローバルで##とは対照的に、また

、1 #との1は、セッションテーブルは、ありますか? stored procedureが完了し、DROP TABLE #tableを実行していない場合... #tableはまだ存在しますか?それがセッションベースの場合、私は再びそれにアクセスできますか?

+2

注:表変数には統計はなく、トランザクションには参加しません。心に留めておくべきこと。 –

+0

テーブル変数は常にメモリに格納されていますが、tempテーブルはtempdbに格納され、ディスクにヒットします。これらはどちらも厳密には真実ではありません(実際には両方ともtempdbに入っていますが、可能であれば両方がメモリに残っていて、必要に応じて両方ともディスクに書き込まれます) –

+0

[SQL Serverの一時テーブルとテーブル変数の違いは? (http://stackoverflow.com/questions/27894/whats-the-difference-between-a-temp-table-and-table-variable-in-sql-server) – Makoto

答えて

2

テーブル変数を使用すると、一時テーブル(KB #243586およびKB #305977を参照)よりもストアドプロシージャの再コンパイルが少なくなる可能性があります。ロールバックできないため、トランザクションログを気にする必要はありません。

##tableは、グローバル一時テーブルに似ています。 yes #tableは指定されたスコープ内にのみ存在し、与えられたスコープからアクセスすることは決してないので存在しません。

編集

私もそれも何とかとして一時テーブルを動作するためCTE(共通テーブル式)を使用することを指すのが好き

Which are more performant, CTE or temporary tables?

+0

「yes#テーブルが存在しないため、指定されたスコープ内でのみアクセスし、指定されたスコープからアクセスすることは決してありません」と誤解を招く。 #tableはセッションスコープに存在します。そのため、同じセッションで呼び出された別のストアドプロシージャから再度アクセスできます。つまり、クリーンアップする前に、テーブル変数よりも長い間ハングアップする必要があります。 –

0

あなたのタイトルにテーブル変数が記述されているので、あなたはテーブル変数について質問しません。 ..しかし、テーブル変数が同じように宣言されています

DECLARE @Banana TABLE 
(
    Id INT, 
    Name VARCHAR(20) 
) 
-1

ローカルの一時テーブル(#table)はSPで作成された場合はSPが終了した後、それがドロップされます。 BOLは言う:ストアドプロシージャで作成したローカルの一時テーブルは自動的に を落としている

  • :明示的にDROP TABLEを使用してドロップしない限り、彼らはスコープ、 の外出時

    一時テーブルは自動的に削除されますストアドプロシージャが終了します。テーブルは、テーブルを作成した プロシージャによって実行されたネストされたストアドプロシージャによって参照される にすることができます。テーブルを作成したストアドプロシージャを呼び出したプロセスを で参照することはできません。

  • 他のすべてのローカル一時テーブルは、現在のセッションの末尾の に自動的に削除されます。

  • グローバルテンポラリテーブルは、テーブルを作成したセッション が終了し、他のすべてのタスクがそれらを参照するのを停止すると自動的に削除されます。タスクとテーブルの関連付けは、単一のTransact-SQLステートメントの実行中のみ維持される です。この は、作成セッションが終了したときに テーブルをアクティブに参照していた最後のTransact-SQLステートメント の完了時に、グローバル一時テーブルが削除されることを意味します。

関連する問題