SQL Serverで一時テーブルの作成と削除の方法

SQLの実行結果を一時的にどこかに保存したい場合があります。サブクエリで1か月の売上データを集計して、複数の箇所で使い回したい時、毎回SQLを発行しているとパフォーマンス的にボトルネックとなることがあります。そのような場合は、SQL Serverの一時テーブルを使用して、一時テーブルに売上集計結果を保存しておくことでリソースを最小限に抑えることができます。

特に大きなデータ、1000万以上のレコードを保持するテーブルへのクエリでは効果を発揮するかと思います。集計したサマリー結果を一時テーブルに保存しておくことで、毎回膨大なレコードにアクセスする必要がないからです。

概要

一時テーブルの保存場所は、「tempdb」に格納されます。これはデータベース→システムデータベース→tempdbに存在します。

一時テーブルには「ローカル一時テーブル」と「グローバル一時テーブル」が存在しています。ローカルを作成する場合は、先頭に「#(シャープ)」を付けます。作成したユーザの現在の接続(セッション)でのみアクセス可能です。作成したユーザがインスタンスから切断されると削除されます。

グローバル一時テーブルは、テーブル名の先頭に「##」(シャープ・シャープ)を付けます。作成するとすべてのユーザからアクセスすることができます。作成したグローバル一テーブルを参照するすべてのユーザがインスタンスから切断されると、削除されます。

ローカル一時テーブルの作成方法

CREATE TABLE #一時テーブル名(
    テーブル定義
)

サンプル

CREATE TABLE #TEMPTABLE(
     NO      int NOT NULL
    ,YMD     varchar(6) NULL
    ,SALES   decimal(10,2) NOT NULL
)

テーブル名の前に「#」を付けて、CREATE TABLE命令で一時テーブルを作成します。

グローバル一時テーブルの作成方法

CREATE TABLE ##一時テーブル名(
    テーブル定義
)

サンプル

CREATE TABLE ##TEMPTABLE(
     NO      int NOT NULL
    ,YMD     varchar(6) NULL
    ,SALES   decimal(10,2) NOT NULL
)

テーブル名の前に「##」を付けて、CREATE TABLE命令で一時テーブルを作成します。

SQL Serverで使用できるデータ型は以下を参照

一時テーブルに主キーやINDEX、データを追加する

一時テーブルに一般的なテーブルのようにキーやインデックスを追加することができます。

一時テーブルに主キーの設定

ALTER TABLE 一時テーブル名 ADD PRIMARY KEY CLUSTERED 
(
    NO ASC
)

サンプル

ALTER TABLE #TEMPTABLE ADD PRIMARY KEY CLUSTERED 
(
    NO ASC
)

一時テーブルにインデックスを設定する方法

CREATE NONCLUSTERED INDEX インデックス名 ON 一時テーブル名
(
 対象のカラム
)

サンプル

CREATE NONCLUSTERED INDEX TEMPORARY_YMD_INDEX ON #TEMPTABLE
(
 YMD ASC
)

PRIMARY KEYの設定がない場合でもINDEXは追加することは可能です。

一時テーブルにデータを追加する

/*通常のINSERT発行*/
INSERT INTO #TEMPTABLE Values(1,'2020/01',5000.00)
SELECT * FROM #TEMPTABLE

/*別テーブルをレコードをINSERTする*/
INSERT INTO #TEMPTABLE SELECT * FROM TABLE

一時テーブルの削除方法

「SQL Serverのインスタンス」から切断すると自動的に一時テーブルは削除されますが、意図的に削除することもできます。

IF OBJECT_ID(N'tempdb..#TEMPTABLE', N'U') IS NOT NULL
DROP TABLE #TEMPTABLE;