首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 全局臨時表詳解:會話級 vs 事務級、創建語法與應用場景

     編輯:Oracle 資料庫基礎

前言

全局臨時表(GTT)是 Oracle 提供的臨時數據存儲機制,數據隔離於會話/事務,自動清理,無產生重做日志(僅撤銷日志),是複雜報表、ETL 中轉、中間結果集處理的利器。本文詳細對比兩類 GTT,提供創建語法、行為差異、應用場景及最佳實踐。

一、核心特性

  • 定義持久,數據臨時:表結構永久存儲於數據字典,數據隨會話/事務結束自動清除
  • 會話隔離:不同會話只能看到自己的數據,互不干擾
  • 無重做日志:DML 操作不產生 Redo,僅產生 Undo,性能極佳
  • 不佔用永久表空間:數據存儲於臨時表空間
  • 統計信息共享:12c 前統計共享,12c+ 支持會話級私有統計

二、兩類 GTT 深度對比

維度會話級 (ON COMMIT PRESERVE ROWS)事務級 (ON COMMIT DELETE ROWS)
數據生命週期會話結束時清除 (TRUNCATE)事務提交/回滾時清除
COMMIT 影響數據保留數據清除
ROLLBACK 影響數據保留數據清除
典型用途多步驟業務流程中間結果、報表暫存單事務內臨時計算、中轉數據
並發行為會話間完全隔離會話間完全隔離

三、創建語法與實例

1. 會話級臨時表

CREATE GLOBAL TEMPORARY TABLE gtt_session_student (
    stu_id      NUMBER(5),
    class_id    NUMBER(5),
    stu_name    VARCHAR2(50),
    stu_memo    VARCHAR2(200)
) ON COMMIT PRESERVE ROWS;

2. 事務級臨時表

CREATE GLOBAL TEMPORARY TABLE gtt_txn_class (
    class_id    NUMBER(5),
    class_name  VARCHAR2(50),
    class_memo  VARCHAR2(200)
) ON COMMIT DELETE ROWS;

3. 驗證表類型

SELECT table_name, duration
FROM user_tables
WHERE table_name LIKE 'GTT_%';

-- 結果:
-- GTT_SESSION_STUDENT  SYS$SESSION
-- GTT_TXN_CLASS        SYS$TRANSACTION

四、行為演示與驗證

場景 1:會話級表行為

-- 會話 A
INSERT INTO gtt_session_student VALUES (1, 101, 'Alice', 'Session A data');
COMMIT;  -- 數據保留

SELECT * FROM gtt_session_student;  -- 可見 1 行

-- 會話 B (新連接)
SELECT * FROM gtt_session_student;  -- 0 行,隔離

-- 會話 A 斷開連接
-- 會話 B 重新查詢仍為 0 行

場景 2:事務級表行為

-- 會話 A
INSERT INTO gtt_txn_class VALUES (101, 'Math', 'Txn data');
-- 未提交前可見
SELECT * FROM gtt_txn_class;  -- 1 行

COMMIT;  -- 事務提交,數據清除
SELECT * FROM gtt_txn_class;  -- 0 行

-- 新事務
INSERT INTO gtt_txn_class VALUES (102, 'English', 'New txn');
ROLLBACK;  -- 回滾也清除
SELECT * FROM gtt_txn_class;  -- 0 行

五、應用場景決策矩陣

場景推薦類型理由
存儲過程多步驟中間結果傳遞會話級跨 COMMIT 保持數據
報表查詢臨時聚合結果會話級多個查詢共享中間集
ETL 處理階段性數據清洗會話級長事務或多步驟
單一 SQL 複雜計算中轉事務級自動清理,無殘留風險
觸發器內臨時計算事務級隨主事務原子提交/回滾
並發批量處理互不干擾均可天然會話隔離

六、進階特性與限制

1. 索引與約束

  • 支持創建索引(臨時段,同樣隔離)
  • 支持主鍵、唯一、檢查約束
  • 外鍵不可引用 GTT,GTT 也不可引用 外鍵

2. 視圖與同義詞

  • 可基於 GTT 創建視圖
  • 可創建公共/私有同義詞指向 GTT

3. 統計信息管理 (12c+)

-- 會話級私有統計 (默認)
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'GTT_SESSION_STUDENT');

-- 共享統計 (舊行為)
EXEC DBMS_STATS.SET_TABLE_PREFS('SCOTT', 'GTT_SESSION_STUDENT', 'GLOBAL_TEMP_TABLE_STATS', 'SHARED');

4. 限制事項

  • 不支持分區
  • 不支持並行 DML
  • 不支持外鍵關聯
  • 無法在分布式事務中使用
  • 導出導入僅導出定義,不導出數據

七、性能優化建議

  • 大量數據插入使用 APPEND Hint:`INSERT /*+ APPEND */ INTO gtt_...`
  • 避免頻繁 TRUNCATE,依賴自動清理機制
  • 臨時表空間配置充足,啟用 ASSM
  • 12c+ 使用會話級私有統計提升優化器決策質量

八、遷移至 18c/19c 私有臨時表

Oracle 18c 引入私有臨時表 (PTT),定義也臨時,會話結束自動 Drop:

-- 創建私有臨時表 (名稱必須以 ORA$PTT_ 開頭)
CREATE PRIVATE TEMPORARY TABLE ORA$PTT_MY_DATA (
    id   NUMBER,
    val  VARCHAR2(100)
) ON COMMIT PRESERVE DEFINITION;  -- 或 DROP DEFINITION

優勢:無字典爭用、無權限管理、自動清理定義。適用於動態臨時表需求。

結語

全局臨時表是 Oracle 中處理中間結果集的標準方案。準確選擇會話級或事務級,理解其隔離機制、清理時機、統計信息行為,並結合私有臨時表新特性,可構建高效、無鎖、自清理的臨時數據處理流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved