首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 全局臨時表深度解析:會話級 vs 事務級、索引統計與跨版本差異

     編輯:Oracle 資料庫相關知識

核心概念

全局臨時表 (GTT, Global Temporary Table):表定義持久化存儲於數據字典,**資料僅在會話或事務生命周期內可見**,會話結束或提交/回滾時自動清空(TRUNCATE 機制),不產生 Redo/Undo(僅產生極少量元數據 Redo)。

兩種生命周期模式

模式DDL 語法資料可見範圍清空時機典型場景
事務級ON COMMIT DELETE ROWS當前事務COMMIT / ROLLBACK複雜報表中間結果、多步驟 ETL 暫存
會話級ON COMMIT PRESERVE ROWS當前會話會話斷開 / DISCONNECT用戶購物車、跨頁面暫存、PL/SQL 集合替代

建立範例

-- 事務級
CREATE GLOBAL TEMPORARY TABLE gtt_txn (
  id NUMBER,
  process_date DATE,
  status VARCHAR2(20)
) ON COMMIT DELETE ROWS;

-- 會話級
CREATE GLOBAL TEMPORARY TABLE gtt_sess (
  user_id NUMBER,
  cart_items CLOB,
  updated_at TIMESTAMP
) ON COMMIT PRESERVE ROWS;

關鍵特性與限制

✅ 支援特性

  • 索引(同樣為臨時,每會話獨立段)
  • 視圖、同義詞、觸發器
  • 統計資訊收集(DBMS_STATS.GATHER_TABLE_STATS,12c+ 支援會話級統計)
  • EXP/IMP/DATAPUMP 匯出定義(資料不匯出)
  • 分區表(12c+)

❌ 不支援/限制

  • 外鍵約束(無法引用永久表,亦無法被永久表引用)
  • 資料庫鏈接遠端訪問(@dblink 不可見)
  • FLASHBACK TABLE、FLASHBACK QUERY
  • 並行 DML(12c 前)
  • 資料保留超出生命周期

實戰演示:會話隔離性驗證

-- 會話 1
INSERT INTO gtt_sess VALUES (1, 'item_a', SYSTIMESTAMP);
COMMIT;
SELECT * FROM gtt_sess;  -- 返回 1 行

-- 會話 2 (新連線)
SELECT * FROM gtt_sess;  -- 返回 0 行,完全隔離

統計資訊管理(關鍵效能點)

GTT 無共享統計,預設使用動態採樣。12c 引入 會話級私有統計:

-- 12c+ 為當前會話收集統計
EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname=>USER, tabname=>'GTT_SESS', scope=>'SESSION');

-- 查看私有統計
SELECT * FROM USER_TAB_STATISTICS WHERE TABLE_NAME='GTT_SESS';

建議:複雜查詢前在會話中收集一次統計,避免動態採樣誤導優化器。

Oracle vs SQL Server 臨時表差異

維度Oracle GTTSQL Server
定義持久性永久(DDL 字典存儲)本地 #temp 隨會話銷毀;全局 ##temp 隨最後會話銷毀
儲存層臨時表空間(磁碟)tempdb(記憶體優先,溢寫磁碟)
事務級隔離原生支援 ON COMMIT DELETE ROWS無對應機制,需手動 DELETE
跨會話共享不可見(定義共享,資料隔離)全局 ##temp 可跨會話共享資料
頻繁建刪效能極高(僅字典操作)頻繁 CREATE/DROP 易導致 tempdb 爭用、系統表膨脹

最佳實踐清單

  1. 命名規範:GTT_<業務>_ 區分生命周期
  2. 索引策略:僅在會話內高頻查詢欄位建立,避免過度索引增加 INSERT 開銷
  3. 統計收集:12c+ 使用 SCOPE=>'SESSION';11g 依賴動態採樣 OPTIMIZER_DYNAMIC_SAMPLING=4
  4. 避免長會話佔用:連線池環境下,會話級 GTT 可能因連線重用導致資料洩漏,建議事務級優先
  5. 大數據量排序/雜湊:優先用 GTT 替代 WITH 子查詢物化,可控制溢寫臨時表空間

總結

Oracle GTT 以「定義永久、資料暫態」設計完美平衡了效能與隔離性。**事務級 (ON COMMIT DELETE ROWS) 為預設最佳選擇**,除非確有跨事務共享需求。12c 私有統計功能大幅提升複雜報表查詢穩定性,建議升級利用。

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