SQL Serverのローカルおよびグローバル一時テーブル


156

SQL Serverのローカル一時テーブルとグローバル一時テーブルの違いは何ですか?


2
ここでは、このについてのいくつかの要約詳細があり、ここをクリック
Jayesh Sorathiaに

5
テーブル変数を使用するときは注意してください。これらをクエリで使用すると、インデックスが作成されないため、クエリプランで深刻なパフォーマンスの問題が発生する可能性があります。

実際には、必要に応じて一時テーブルにインデックスを付けることができますが、時間とリソースもかかるため、パフォーマンスやリソースの問題が発生する可能性があります。
Andrew Steitz 2016

回答:


114

私はこの説明を非常に明確にしています(これはTechnetからの純粋なコピーです):

一時テーブルには、ローカルとグローバルの2つのタイプがあります。ローカル一時テーブルは、テーブルが最初に作成または参照されたときと同じSQL Serverのインスタンスへの接続中に作成者のみに表示されます。ユーザーがSQL Serverのインスタンスから切断すると、ローカル一時テーブルが削除されます。グローバル一時テーブルは、作成後、すべてのユーザーと接続に表示され、テーブルを参照しているすべてのユーザーがSQL Serverのインスタンスから切断されると削除されます。


すばらしい、役立つ回答です。グローバル一時テーブルがSQL Serverによって自動的にクリーンアップされるかどうか、またはいつかに関する特定の情報を探していました。
kwill、

非常に明確で簡潔な答え。誰でもグローバル一時テーブルの良いユースケースを思いつくことができますか?ローカルの一時テーブルの目的とは対照的に、それらの目的を説明するものですか?
トレバー

336
  • テーブル変数DECLARE @t TABLE)は、テーブル変数を作成する接続でのみ表示され、バッチまたはストアドプロシージャが終了すると削除されます。

  • ローカル一時テーブルCREATE TABLE #t)は、それを作成した接続でのみ表示され、接続が閉じられると削除されます。

  • グローバル一時テーブルCREATE TABLE ##t)は誰でも見ることができ、それらを参照しているすべての接続が閉じられると削除されます。

  • TempdbパーマネントテーブルUSE tempdb CREATE TABLE t)は誰でも見ることができ、サーバーを再起動すると削除されます。


55
また、指摘する価値があります。ローカル一時テーブルは、それらを作成したスコープが閉じられると削除されます。したがって、sprocの内部にローカル一時テーブルを作成し、そのsprocの外部でアクセスしようとすると、テーブルは存在しません。

意志の+1。ローカル一時テーブルをオプティマイザとして使用しようとしていて、ストアドプロシージャを「存在しない場合は作成してデータを追加する」イニシャライザとして使用しようとしました。あなたが言うように、代わりにグローバル一時テーブルを使用しない限り、それは機能しません。
キルブレーカー、2013

9
「それらを参照しているすべての接続が閉じられると削除されます」-「それらを参照している」とは正確にはどういう意味ですか?ある接続#1のStoredProcが## TempTableを作成した場合、別の接続#2からそれを見ることができます。10分後(その接続#2がテーブル作成時にアクティブだった場合)答え:グローバル一時テーブルは、テーブルを作成したセッションが終了し、他のすべてのタスクがそれらの参照を停止しました。(別の回答でこのページの詳細を参照してください)
tbone '26

ストアドプロシージャを使用して、後続のロジックで必要なローカル一時テーブル(#t)を作成しようとしましたが、子ストアドプロシージャの呼び出しで使用できるようにするには、親ストアドプロシージャで作成する必要があることがわかりました。同じようにテーブルをセットアップし、共通のsprocを呼び出す必要があるストアドプロシージャがたくさんあるので、これは悲しいことでした。子呼び出しが兄弟によって作成されたテーブルにアクセスできるこの場合、グローバル一時テーブルは機能しますか?私たちは、SQL Server 2008を使用している
ブランドン

1
@ブランドンあなたはまったく正しい。それには機能がありません。TSQLによる一時データの適切なスコープのサポートは、かなり大雑把です。それはまるで言語デザイナーがすべてがグローバルであることを望んだかのようです。また、クロージャーのサポートはほとんどありません。カーソル変数を渡すことができます。しかし、行ごとに苦労することはできないため、これもまた別のワームです。
Anthony Faull

12

1.) ローカル一時テーブルは、接続の間だけ存在します。複合ステートメント内で定義されている場合は、複合ステートメントの間だけ存在します。

ローカル一時テーブルは、テーブルを作成したSQL Serverセッションまたは接続(シングルユーザーを意味する)でのみ使用できます。これらは、テーブルを作成したセッションが閉じられると自動的に削除されます。ローカル一時テーブル名は、単一のハッシュ( "#")記号で開始されます。

CREATE TABLE #LocalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp

ローカル一時テーブルのスコープは、現在のユーザーの現在のセッションに存在し、現在のクエリウィンドウに存在します。現在のクエリウィンドウを閉じるか、新しいクエリウィンドウを開いて、上記で作成した一時テーブルを見つけようとすると、エラーが発生します。


2.) グローバル一時テーブルはデータベースに永続的に残りますが、行は特定の接続内にのみ存在します。接続が閉じられると、グローバル一時テーブルのデータが消えます。ただし、テーブル定義は、データベースが次回開かれたときにアクセスできるようにデータベースに残ります。

グローバル一時テーブルは、すべてのSQL Serverセッションまたは接続で使用できます(すべてのユーザーを意味します)。これらは任意のSQL Server接続ユーザーが作成でき、すべてのSQL Server接続が閉じられると自動的に削除されます。グローバル一時テーブル名は、二重ハッシュ( "##")記号で開始されます。

CREATE TABLE ##GlobalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp

グローバル一時テーブルはすべてのSQL Server接続に表示されますが、ローカル一時テーブルは現在のSQL Server接続にのみ表示されます。


2
グローバル一時テーブルの定義は、それが(他のDBから)動作すると予想される方法ですが、私のテストでは、SQL Serverで実際に何が発生するかが示されています。終了し、他のすべてのタスクはそれらの参照を停止しました」
Nickolay 2018

11

Books Onlineからの引用:

ローカル一時テーブルは、現在のセッションでのみ表示されます。グローバル一時テーブルはすべてのセッションで表示されます。

一時テーブルは、DROP TABLEを使用して明示的に削除しない限り、範囲外になると自動的に削除されます。

  • ストアドプロシージャで作成されたローカル一時テーブルは、ストアドプロシージャが完了すると自動的に削除されます。テーブルは、テーブルを作成したストアドプロシージャによって実行されるネストされたストアドプロシージャから参照できます。テーブルを作成したストアドプロシージャを呼び出したプロセスは、テーブルを参照できません。
  • 他のすべてのローカル一時テーブルは、現在のセッションの終了時に自動的に削除されます。
  • グローバル一時テーブルは、テーブルを作成したセッションが終了し、他のすべてのタスクがそれらの参照を停止すると、自動的に削除されます。タスクとテーブルの関連付けは、単一のTransact-SQLステートメントの存続期間中のみ維持されます。つまり、セッションの作成が終了したときにテーブルをアクティブに参照していた最後のTransact-SQLステートメントが完了すると、グローバル一時テーブルが削除されます。

0

ローカル一時テーブルローカル一時テーブルを作成してから別の接続を開いてクエリを実行すると、次のエラーが発生します。

一時テーブルには、それらを作成したセッション内でのみアクセスできます。

グローバル一時テーブル:他の接続からアクセスできる一時テーブルを作成したい場合があります。この場合、グローバル一時テーブルを使用できます。

グローバル一時テーブルは、それを参照するすべてのセッションが閉じられたときにのみ破棄されます。


0

データベーススコープのグローバル一時テーブル(現在、Azure SQLデータベースでのみサポートされています)もあることに注意してください。

SQL Serverのグローバル一時テーブル(##テーブル名で開始)はtempdbに格納され、SQL Serverインスタンス全体ですべてのユーザーのセッション間共有されます。

Azure SQL Databaseは、tempdbにも格納され、データベースレベルにスコープ設定されたグローバル一時テーブルをサポートしています。つまり、グローバル一時テーブルは、同じAzure SQLデータベース内のすべてのユーザーのセッションで共有されます。他のデータベースのユーザーセッションは、グローバル一時テーブルにアクセスできません。

-- Session A creates a global temp table ##test in Azure SQL Database testdb1
-- and adds 1 row
CREATE TABLE ##test ( a int, b int);
INSERT INTO ##test values (1,1);

-- Session B connects to Azure SQL Database testdb1 
-- and can access table ##test created by session A
SELECT * FROM ##test
---Results
1,1

-- Session C connects to another database in Azure SQL Database testdb2 
-- and wants to access ##test created in testdb1.
-- This select fails due to the database scope for the global temp tables 
SELECT * FROM ##test
---Results
Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'

ALTER DATABASE SCOPED CONFIGURATION

GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }

適用対象:Azure SQLデータベース(機能はパブリックプレビュー中)

グローバル一時テーブルの自動ドロップ機能を設定できます。デフォルトはONです。つまり、どのセッションでも使用されていない場合、グローバル一時テーブルは自動的に削除されます。OFFに設定すると、グローバル一時テーブルはDROP TABLEステートメントを使用して明示的に削除する必要があります。そうしないと、サーバーの再起動時に自動的に削除されます。

Azure SQL Databaseの単一データベースとエラスティックプールを使用すると、SQLデータベースサーバーの個々のユーザーデータベースでこのオプションを設定できます。SQL ServerおよびAzure SQL Databaseマネージドインスタンスでは、このオプションはTempDBで設定され、個々のユーザーデータベースの設定は影響を与えません。


0

グローバル一時テーブルを見つけることができるユーザーを示す回答はありませんでした。SSMS内を移動するときに、ローカルおよびグローバル一時テーブルを同じ場所に表示できます。このリンクから取得した以下のスクリーンショット。

データベース->システムデータベース-> tempdb->一時テーブル

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.