Programmingバックエンド開発者

SQLにおける一時テーブル(Temporary Tables)の特徴は何ですか?正しく使用する方法と、テーブル変数(Table Variables)との違いは何ですか?

Hintsage AIアシスタントで面接を突破

回答。

一時テーブル(Temporary Tables)とテーブル変数(Table Variables)は、クエリやプロシージャの実行中の一時的なデータを保持するための異なるメカニズムです。

一時テーブル(例:#TempTable in MS SQL):

  • 一時データベースtempdbに格納されます。
  • 現在のセッションまたは接続でのみ見えます。
  • インデックスや制約を作成でき、トランザクションの一部にもなれます。
  • 大量のデータや複雑な処理を扱う際に使用されます。

テーブル変数(例:@MyTable):

  • バッチ/プロシージャ/関数内でのスコープを持っています。
  • より小さなデータセットのために最適化されることが多いです。
  • 完全なインデックスを作成できません(PRIMARY KEY/UNIQUEを除く)。
  • ブロックされる可能性が低く、トランザクションに異なる参加の仕方をします。

例:

-- 一時テーブル 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を追加した後、問題は消えました。


物語

レポート間のプロセス間通信にグローバル一時テーブルを使用しました。 同時実行での不確実な動作を考慮せず、セッションが同じデータを巡って競合しました。各セッションのために個別の一時テーブルに置き換えることが決定されました。