核心價值
大表關聯查詢時,將中間結果集物化到臨時表,避免重複掃描大表、減少連接開銷。數據存儲於臨時表空間(TEMP),會話/事務結束自動清理,**不產生 Redo/Undo**,極大降低 I/O 與爭用。
兩種生命週期模式
| 特性 | 會話級 | 事務級 |
| 語法 | ON COMMIT PRESERVE ROWS | ON COMMIT DELETE ROWS |
| 數據可見性 | 僅當前會話可見,跨事務持久 | 僅當前事務可見,提交/回滾即清空 |
| 清理觸發 | 會話斷開(或 TRUNCATE) | Commit / Rollback / 會話斷開 |
| 並發隔離 | 不同會話互不干擾 | 不同事務互不干擾 |
創建示例
-- 會話級:存儲用戶登錄後的購物車、權限集等
CREATE GLOBAL TEMPORARY TABLE SESS_CART (
USER_ID NUMBER, ITEM_ID NUMBER, QTY NUMBER
) ON COMMIT PRESERVE ROWS;
-- 事務級:批量處理中間暫存、ETL 階段表
CREATE GLOBAL TEMPORARY TABLE TXN_STAGE (
BATCH_ID NUMBER, SRC_KEY VARCHAR2(50), VAL NUMBER
) ON COMMIT DELETE ROWS;
適用場景判斷樹
- SQL 關聯 ≥ 2 張大表,且關聯後結果集極小(<1%)。
- 中間結果需多次複用(報表多指標、多步驟 ETL)。
- 無需持久化,業務邏輯天然具備會話/事務邊界。
原生限制與擴展設計
| 限制 | 影響 | 擴展方案:自建「業務臨時表」 |
| 不支持 LOB | 無法存長文本、圖片、空間數據 | 普通表 + SessionID 列 + 登出觸發器清理 |
| 不支持主外鍵 | 無法維護引用完整性 | 自建表定義 PK/FK,觸發器維護 SessionID 隔離 |
擴展設計模式
- 表結構含
SESSION_ID RAW(16) DEFAULT SYS_CONTEXT('USERENV','SID')。
- 創建視圖
V_MY_TEMP AS SELECT * FROM BIZ_TEMP WHERE SESSION_ID = SYS_CONTEXT('USERENV','SID'),應用層透明訪問。
- 登出觸發器
AFTER LOGOFF ON DATABASE 刪除當前 SessionID 數據。
- 高級用戶可通過去除 SessionID 過濾訪問全局數據(跨會話協作)。
優勢總結
- 原生 GTT:零 Redo/Undo、自動清理、統計信息共享(12c+ 支持會話級統計)。
- 自建模式:突破 LOB/FK 限制、支持跨會話協作、可分區/壓縮/並行,代價是產生 Redo/Undo 且需自行管理清理。
- 選型建議:純關聯中間結果 → GTT;含 LOB/需 FK/跨會話共享 → 自建模式。