全局臨時表 (GTT) 是 Oracle 處理中間結果集的輕量級工具,數據僅在會話/事務內可見,不產生 REDO、不佔用永久表空間。本文系統對比兩類型、實測限制、提供自定義擴展方案支援 LOB/外鍵/跨會話訪問。
| 特性 | 會話級 (ON COMMIT PRESERVE ROWS) | 事務級 (ON COMMIT DELETE ROWS) |
|---|---|---|
| 數據生命周期 | 會話結束時截斷 | COMMIT/ROLLBACK/會話結束時截斷 |
| 跨事務可見 | 是 | 否 |
| 典型場景 | 多步驟業務流程中間表 | 單語句/單事務臨時集合 |
-- 會話級
CREATE GLOBAL TEMPORARY TABLE student (
stu_id NUMBER(5), class_id NUMBER(5),
stu_name VARCHAR2(8), stu_memo VARCHAR2(200)
) ON COMMIT PRESERVE ROWS;
-- 事務級
CREATE GLOBAL TEMPORARY TABLE classes (
class_id NUMBER(5), class_name VARCHAR2(8), class_memo VARCHAR2(200)
) ON COMMIT DELETE ROWS;
DBMS_STATS.GATHER_TABLE_STATS 影響所有會話),12c+ 支持會話級統計SESSION_ID 列(SYS_CONTEXT('USERENV','SID'))DELETE FROM ext_gtt WHERE session_id = :old_sidSESSION_IDWHERE session_id = SYS_CONTEXT(...)CREATE VIEW v_ext_gtt AS SELECT * FROM ext_gtt WHERE session_id = SYS_CONTEXT('USERENV','SID'),應用層零感知BEFORE INSERT ON ext_gtt FOR EACH ROW BEGIN :new.session_id := SYS_CONTEXT('USERENV','SID'); END;需要 LOB/外鍵/跨會話審計? ├─ 否 → 官方 GTT(會話級/事務級) └─ 是 → 自定義擴展表 + 視圖 + 觸發器 + 登出清理
自定義方案本質是「應用級多租戶隔離」,適合中間件層統一實現,避免業務代碼散落 SESSION_ID 邏輯。