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

Oracle 全局臨時表實戰指南:會話級與事務級差異、適用場景與擴展設計

     編輯:Oracle 資料庫基礎

核心價值

大表關聯查詢時,將中間結果集物化到臨時表,避免重複掃描大表、減少連接開銷。數據存儲於臨時表空間(TEMP),會話/事務結束自動清理,**不產生 Redo/Undo**,極大降低 I/O 與爭用。

兩種生命週期模式

特性會話級事務級
語法ON COMMIT PRESERVE ROWSON 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;

適用場景判斷樹

  1. SQL 關聯 ≥ 2 張大表,且關聯後結果集極小(<1%)。
  2. 中間結果需多次複用(報表多指標、多步驟 ETL)。
  3. 無需持久化,業務邏輯天然具備會話/事務邊界。

原生限制與擴展設計

限制影響擴展方案:自建「業務臨時表」
不支持 LOB無法存長文本、圖片、空間數據普通表 + SessionID 列 + 登出觸發器清理
不支持主外鍵無法維護引用完整性自建表定義 PK/FK,觸發器維護 SessionID 隔離

擴展設計模式

  1. 表結構含 SESSION_ID RAW(16) DEFAULT SYS_CONTEXT('USERENV','SID')。
  2. 創建視圖 V_MY_TEMP AS SELECT * FROM BIZ_TEMP WHERE SESSION_ID = SYS_CONTEXT('USERENV','SID'),應用層透明訪問。
  3. 登出觸發器 AFTER LOGOFF ON DATABASE 刪除當前 SessionID 數據。
  4. 高級用戶可通過去除 SessionID 過濾訪問全局數據(跨會話協作)。

優勢總結

  • 原生 GTT:零 Redo/Undo、自動清理、統計信息共享(12c+ 支持會話級統計)。
  • 自建模式:突破 LOB/FK 限制、支持跨會話協作、可分區/壓縮/並行,代價是產生 Redo/Undo 且需自行管理清理。
  • 選型建議:純關聯中間結果 → GTT;含 LOB/需 FK/跨會話共享 → 自建模式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved