SQL Serverのローカル一時テーブルとグローバル一時テーブルの違いは何ですか?
SQL Serverのローカル一時テーブルとグローバル一時テーブルの違いは何ですか?
回答:
私はこの説明を非常に明確にしています(これはTechnetからの純粋なコピーです):
一時テーブルには、ローカルとグローバルの2つのタイプがあります。ローカル一時テーブルは、テーブルが最初に作成または参照されたときと同じSQL Serverのインスタンスへの接続中に作成者のみに表示されます。ユーザーがSQL Serverのインスタンスから切断すると、ローカル一時テーブルが削除されます。グローバル一時テーブルは、作成後、すべてのユーザーと接続に表示され、テーブルを参照しているすべてのユーザーがSQL Serverのインスタンスから切断されると削除されます。
テーブル変数(DECLARE @t TABLE
)は、テーブル変数を作成する接続でのみ表示され、バッチまたはストアドプロシージャが終了すると削除されます。
ローカル一時テーブル(CREATE TABLE #t
)は、それを作成した接続でのみ表示され、接続が閉じられると削除されます。
グローバル一時テーブル(CREATE TABLE ##t
)は誰でも見ることができ、それらを参照しているすべての接続が閉じられると削除されます。
Tempdbパーマネントテーブル(USE tempdb CREATE TABLE t
)は誰でも見ることができ、サーバーを再起動すると削除されます。
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接続にのみ表示されます。
Books Onlineからの引用:
ローカル一時テーブルは、現在のセッションでのみ表示されます。グローバル一時テーブルはすべてのセッションで表示されます。
一時テーブルは、DROP TABLEを使用して明示的に削除しない限り、範囲外になると自動的に削除されます。
データベーススコープのグローバル一時テーブル(現在、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で設定され、個々のユーザーデータベースの設定は影響を与えません。