全局臨時表(GTT)是 Oracle 提供的臨時數據存儲機制,數據隔離於會話/事務,自動清理,無產生重做日志(僅撤銷日志),是複雜報表、ETL 中轉、中間結果集處理的利器。本文詳細對比兩類 GTT,提供創建語法、行為差異、應用場景及最佳實踐。
| 維度 | 會話級 (ON COMMIT PRESERVE ROWS) | 事務級 (ON COMMIT DELETE ROWS) |
|---|---|---|
| 數據生命週期 | 會話結束時清除 (TRUNCATE) | 事務提交/回滾時清除 |
| COMMIT 影響 | 數據保留 | 數據清除 |
| ROLLBACK 影響 | 數據保留 | 數據清除 |
| 典型用途 | 多步驟業務流程中間結果、報表暫存 | 單事務內臨時計算、中轉數據 |
| 並發行為 | 會話間完全隔離 | 會話間完全隔離 |
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;
CREATE GLOBAL TEMPORARY TABLE gtt_txn_class (
class_id NUMBER(5),
class_name VARCHAR2(50),
class_memo VARCHAR2(200)
) ON COMMIT DELETE ROWS;
SELECT table_name, duration
FROM user_tables
WHERE table_name LIKE 'GTT_%';
-- 結果:
-- GTT_SESSION_STUDENT SYS$SESSION
-- GTT_TXN_CLASS SYS$TRANSACTION
-- 會話 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 行
-- 會話 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 複雜計算中轉 | 事務級 | 自動清理,無殘留風險 |
| 觸發器內臨時計算 | 事務級 | 隨主事務原子提交/回滾 |
| 並發批量處理互不干擾 | 均可 | 天然會話隔離 |
-- 會話級私有統計 (默認)
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');
APPEND Hint:`INSERT /*+ APPEND */ INTO gtt_...`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 中處理中間結果集的標準方案。準確選擇會話級或事務級,理解其隔離機制、清理時機、統計信息行為,並結合私有臨時表新特性,可構建高效、無鎖、自清理的臨時數據處理流程。