一時テーブル(Temporary Tables)とテーブル変数(Table Variables)は、クエリやプロシージャの実行中の一時的なデータを保持するための異なるメカニズムです。
一時テーブル(例:#TempTable in MS SQL):
テーブル変数(例:@MyTable):
例:
-- 一時テーブル CREATE TABLE #Temp( Id INT, Name NVARCHAR(100) ); INSERT INTO #Temp VALUES (1, 'Test'); SELECT * FROM #Temp; -- テーブル変数 DECLARE @MyTable TABLE (Id INT, Name NVARCHAR(100)); INSERT INTO @MyTable VALUES (2, 'Sample'); SELECT * FROM @MyTable;
一時テーブル #TempTable とグローバル一時テーブル ##GlobalTempTable のライフタイムとスコープの違いは何ですか?
正しい答え:
#TempTable は現在のセッションでのみ見え、接続が閉じられるか、明示的にDROPされると消えます。##GlobalTempTable は、テーブルを使用した最後のセッションが閉じられるか、明示的にDROPされるまで、すべてのセッションからアクセス可能です。最後の接続が閉じられるまで消えません。-- グローバル一時テーブル CREATE TABLE ##GlobalTemp (Id INT);
物語
大規模なレポート処理プロジェクトで、数十万行の一時保管のためにテーブル変数を使用しました。 結果:パフォーマンスが急落し、オプティマイザがクエリのコストを過大評価し、不適切な計画を使用し始めました。一時テーブルへの置き換えが時間の大幅な改善をもたらしました。
物語
あるプロシージャで、一時テーブルを明示的に削除するのを忘れました。 同じセッションでのバッチの再実行時に、「オブジェクトは既に存在します」というエラーが発生しました。作成の前にDROP TABLEを追加した後、問題は消えました。
物語
レポート間のプロセス間通信にグローバル一時テーブルを使用しました。 同時実行での不確実な動作を考慮せず、セッションが同じデータを巡って競合しました。各セッションのために個別の一時テーブルに置き換えることが決定されました。