Oracleの一時テーブルは?

Oracleの一時テーブルの特徴

Oracleの一時テーブル(Global Temporary Table, GTT)は、一時的なデータを格納するための特別なテーブルであり、通常のテーブルとは異なる以下の特徴を持ちます。

  1. データの一時性
    • 一時テーブル自体は永続的に存在するが、データは一時的であり、セッションまたはトランザクションが終了すると削除される。
  2. スコープの種類
    • ON COMMIT DELETE ROWS(トランザクション単位)
      トランザクションがコミットされるとデータが削除される。
    • ON COMMIT PRESERVE ROWS(セッション単位)
      セッションが終了するまでデータが保持される。
  3. 他のユーザーからデータが見えない
    • 一時テーブルに格納されたデータは、そのセッションまたはトランザクション内でのみ有効であり、他のユーザーからは見えない。
  4. UNDO・REDOログの扱い
    • UNDO(ロールバック情報)は最小限しか記録されず、REDOログへの書き込みも通常のテーブルより抑制されるため、パフォーマンスが向上する。
  5. 索引(INDEX)の作成
    • 一時テーブルに対してインデックスを作成できるが、索引データも一時的であり、通常のテーブルの索引とは異なる。
  6. 統計情報の収集
    • 通常のANALYZEDBMS_STATSを使用して統計情報を収集できるが、実際に使用されるデータが変化するため、統計情報の扱いには注意が必要。

以下は、PL/SQLを使用してOracleの一時テーブルに1000件のデータを挿入するサンプルです。

処理の流れ

  1. グローバル一時テーブル(GTT)を作成
  2. PL/SQLブロックでデータを挿入(ループを使用して1000件挿入)
  3. 挿入したデータを確認
1. 一時テーブルの作成

まず、temp_sample_data という一時テーブルを作成します。
データは セッションが終了するまで保持 されるように設定します。

CREATE GLOBAL TEMPORARY TABLE temp_sample_data (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(50),
    created_at DATE
) ON COMMIT PRESERVE ROWS;


2. PL/SQLで1000件のデータを挿入
次に、PL/SQLブロックを使用して1000件のデータを一時テーブルに挿入します。

set serveroutput on;


DECLARE
    v_counter NUMBER := 1;
BEGIN
    FOR v_counter IN 1..1000 LOOP
        INSERT INTO temp_sample_data (id, name, created_at)
        VALUES (v_counter, 'Sample_' || v_counter, SYSDATE);
    END LOOP;

    commit;
    -- コミット不要 (一時テーブルのため)
    DBMS_OUTPUT.PUT_LINE('1000件のデータを挿入しました。');
END;
/

3. 挿入データの確認
SELECT COUNT(*) FROM temp_sample_data;


4. セッション終了後の動作

CREATE GLOBAL TEMPORARY TABLE temp_sample_data (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(50),
    created_at DATE
) ON COMMIT DELETE ROWS;

省略・・・・・


Follow me!