Oracle 一時表 (GTT) の作成・削除と使い分けのコツ

Oracle Master Silver

Oracle 一時表は、セッション内でのみデータを保持し、処理終了後に自動削除される便利な機能です。特に「Oracle グローバル一時表(GTT)」は、複雑なバッチ処理の中間データ保持に多用されます。本記事では 19c を前提に、実装手順や削除タイミングの制御、利用上の注意点を分かりやすく解説します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

結論・最短手順(やることリスト)

Oracle 一時表(グローバル一時表:GTT)を実装する際の主要なステップは以下の通りです。

  • 定義の作成: CREATE GLOBAL TEMPORARY TABLE 文で表の定義を作成する(データは永続化されないが、定義は辞書に残る)。
  • スコープの決定: トランザクション終了時に消すか(DELETE ROWS)、セッション終了時まで残すか(PRESERVE ROWS)を選択。
  • 権限の付与: 利用するユーザーに CREATE TABLE または CREATE ANY TABLE 権限があることを確認。
  • 一時表領域の確認: データは TEMPORARY 表領域に格納されるため、十分な空き容量を確保する。

背景と基礎:Oracle 一時表とは?

通常、Oracle の表に挿入されたデータは COMMIT 後に永続化されます。しかし、一時的な計算結果を保存したい場合、通常の表では REDO ログの生成や領域管理のオーバーヘッドが大きくなります。

グローバル一時表 (GTT) の仕組み

GTT は、「表の定義は全ユーザーで共有するが、中身のデータはセッションごとに独立している」のが最大の特徴です。

  • 機密性: 自分のセッションで挿入したデータは、他のセッション(ユーザー)からは絶対に見えません。
  • 自動削除: 定義したスコープ(トランザクション終了時またはセッション終了時)に合わせて、Oracle が自動的にデータをクリーンアップします。
  • 効率性: 永続表に比べて REDO ログの生成が抑えられるため、大量処理に向いています。

初級者メモ: 「グローバル」という名前ですが、データが共有されるわけではありません。「定義がグローバル(全員共通)」という意味です。

具体的な活用例:どんな時に一時表を使うか?

一時表は、単なる「仮置き場」以上のメリットを提供します。以下のようなケースで特に有効です。

1. 複雑な多段階バッチ処理の中間計算

1 つの SQL では記述が困難なほど複雑な計算を行う際、ステップごとの中間結果を一時表に格納します。

  • 利点: 各ステップの結果を確認しやすく、後続の処理で同じ中間結果を何度も参照する場合に SQL を簡素化できます。

2. 大量データの検証・クレンジング処理

外部システムからの取り込みデータを、本番の表に反映させる前に一時的に格納します。

  • 利点: 本番の表(永続表)をロックすることなく、データ不整合のチェックやフォーマット変換を高速に行えます。

3. Webアプリケーションの検索フィルタ条件保持

複雑な条件で絞り込んだ結果(ID リストなど)を一時表に保持し、それをベースに複数の帳票やグラフを生成します。

  • 利点: セッションごとに独立しているため、他のユーザーの検索条件と混ざる心配がなく、セッション終了時に自動でクリアされるため掃除が不要です。

手順・実装:一時表の作成方法

作成時には ON COMMIT 句を使用して、データの有効期限を指定します。

  1. トランザクション固有(デフォルト): COMMIT を発行するとデータが消える設定。
  2. セッション固有: ログアウト(切断)するまでデータが残る設定。

実行例:SQL スニペット

実行環境:Oracle Database 19c / Oracle Linux 前提権限:CREATE TABLE 権限を保持した一般スキーマ

1. トランザクション終了時にデータを削除する場合

バッチ処理などで、一つの INSERTSELECT が終わったら即座に空にしたい場合に適しています。

-- Create Global Temporary Table (Transaction specific)
CREATE GLOBAL TEMPORARY TABLE GTT_WORK_DATA (
    item_id    NUMBER,
    item_name  VARCHAR2(100),
    amount     NUMBER
) ON COMMIT DELETE ROWS;

-- Insert data
INSERT INTO GTT_WORK_DATA (item_id, item_name, amount) VALUES (1, 'Sample A', 500);

-- Data exists before commit
SELECT COUNT(*) FROM GTT_WORK_DATA;

-- Data will be deleted after commit
COMMIT;

-- Result will be 0
SELECT COUNT(*) FROM GTT_WORK_DATA;

補足:ON COMMIT DELETE ROWS はデフォルト設定のため、省略可能です。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

2. セッション終了時までデータを保持する場合

複数のトランザクションにまたがって計算結果を使い回したい場合に適しています。

-- Create Global Temporary Table (Session specific)
CREATE GLOBAL TEMPORARY TABLE GTT_SESSION_DATA (
    user_id    NUMBER,
    log_msg    VARCHAR2(200)
) ON COMMIT PRESERVE ROWS;

-- Insert and Commit
INSERT INTO GTT_SESSION_DATA VALUES (101, 'Process Started');
COMMIT;

-- Data still exists after commit
SELECT * FROM GTT_SESSION_DATA;

-- Data is cleared only after session disconnects.

補足:セッションが切断されると、データは自動的に切り捨て(TRUNCATE)されます。

トラブルシューティング:代表的な ORA エラー

エラーコード原因対処法
ORA-14450他のセッションが使用中の GTT を変更・削除しようとした。使用中のセッションが終了するのを待つか、接続を切断します。
ORA-14452データが残っている状態で DROP TABLE を試みた。TRUNCATE TABLE を実行するか、セッションを終了してから削除します。
ORA-01652一時表領域 (TEMP) が不足している。大量データ挿入時は、一時表領域のサイズ拡張またはクエリの最適化を検討してください。

運用・監視・セキュリティ上の注意

メリットと落とし穴

  • メリット: ロック競合が発生しません。各ユーザーが自分のデータ領域を持つため、通常の表のような「行ロック」による待ちが発生しないのが強みです。
  • 落とし穴: インデックスの作成は可能ですが、統計情報の扱いに注意が必要です。12c 以降、セッション固有の統計情報を保持できるようになりましたが、不適切な統計情報は実行計画の悪化を招きます。

データの戻し方

一時表のデータは自動削除されるため、誤って COMMIT して消えたデータを ROLLBACK で戻すことはできません(DELETE ROWS 設定時)。

FAQ:よくある質問

Q1. 一時表を削除(DROP)したいのですが、エラーになります。

A. その表にデータを入れているアクティブなセッションがある場合、削除できません。全てのセッションが終了していることを確認してください。

Q2. 複数のユーザーで同じ名前の「オラクル 一時表」を使えますか?

A. はい。表の定義は 1 つですが、データはユーザー(セッション)ごとに独立しているため、競合することなく同時に利用可能です。

Q3. TRUNCATE 文は使えますか?

A. 使用可能です。セッションが継続していても、明示的にデータを全削除したい場合に有効です。

まとめ

  • Oracle 一時表は、一時データの高速処理とセッション分離に最適。
  • GTT(グローバル一時表)は定義が永続、データが一時的。
  • ON COMMIT DELETE ROWS は短期、PRESERVE ROWS は長期(セッション内)保持。
  • データの格納先は TEMP 表領域

今後の更新ポイント:19c から 23ai への変遷

Oracle 18c 以降では、「プライベート一時表 (Private Temporary Tables: PTT)」という新機能が登場しています。

  • PTT の特徴: メモリ上に定義されるため、辞書に情報が残りません(ORA$PTT_ で始まる名前を付けるルール)。
  • 23ai の視点: より軽量な PTT の利用が推奨されるケースが増えていますが、開発のしやすさやツール対応の面では依然として GTT が主流です。

[参考]
表の管理

コメント

タイトルとURLをコピーしました