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

Oracle 全域暫存表完整指南:會話級 vs 事務級、動態建表、效能優勢與避坑指南

     編輯:Oracle 資料庫基礎

前言

全域暫存表 (Global Temporary Table, GTT) 讓多會話共享表結構、隔離數據,無需手動清理,是複雜報表、ETL 中轉、多步驟業務邏輯的利器。本文系統梳理兩種保留模式、動態建表範例、統計資訊陷阱與最佳實踐。

一、兩種保留模式:語法與行為差異

特性會話級 ON COMMIT PRESERVE ROWS事務級 ON COMMIT DELETE ROWS
數據可見性僅當前會話可見僅當前會話可見
提交行為保留,斷開會話才截斷刪除,每次 COMMIT 截斷
適用場景跨多事務的臨時集合(如購物車、多步精靈)單事務內中間結果(如複雜報表分步聚合)
建表語法CREATE GLOBAL TEMPORARY TABLE gtt_session (...) ON COMMIT PRESERVE ROWS;CREATE GLOBAL TEMPORARY TABLE gtt_txn (...) ON COMMIT DELETE ROWS;

二、核心特性速覽

  • 結構永久,數據暫存:DDL 持久化於數據字典,數據存在臨時表空間
  • 會話隔離:會話 A 插入 100 列,會話 B 查詢為 0 列
  • 無 Redo/Undo 開銷:DML 僅產生極少 Undo,無 Redo,效能極高
  • 不支援外鍵/分區/並行 DML
  • 索引/視圖/觸發器:可建立,但同樣會話隔離

三、動態建表與使用範例 (PL/SQL)

CREATE OR REPLACE PROCEDURE proc_temp_demo (
  p_col1 VARCHAR2,
  p_col2 VARCHAR2
) AS
  v_cnt  NUMBER;
  v_sql  VARCHAR2(1000);
BEGIN
  -- 1. 若不存在則動態建表(事務級)
  SELECT COUNT(*) INTO v_cnt FROM user_tables WHERE table_name = 'T_TEMP';
  IF v_cnt = 0 THEN
    EXECUTE IMMEDIATE q'[
      CREATE GLOBAL TEMPORARY TABLE t_temp (
        col1 VARCHAR2(10),
        col2 VARCHAR2(10)
      ) ON COMMIT DELETE ROWS
    ]';
  END IF;

  -- 2. 插入測試數據
  EXECUTE IMMEDIATE 'INSERT INTO t_temp VALUES (:1, :2)' USING p_col1, p_col2;

  -- 3. 驗證隔離性:同會話可讀
  EXECUTE IMMEDIATE 'SELECT col1 FROM t_temp' INTO v_cnt;
  DBMS_OUTPUT.PUT_LINE('Inserted col1: ' || v_cnt);

  -- 4. 手動清理(事務級其實 COMMIT 即自動清)
  EXECUTE IMMEDIATE 'DELETE FROM t_temp';
  COMMIT;

  -- 5. 演示結束可選擇 DROP(生產慎用,DDL 會產生硬解析)
  -- EXECUTE IMMEDIATE 'DROP TABLE t_temp';
END;
/

四、統計資訊陷阱與解決方案

問題:GTT 無持久統計資訊,優化器常用「預設選擇率」導致執行計劃偏差(如全表掃描 vs 索引)。

解決 (11g+):

-- 會話級鎖定統計資訊
EXEC DBMS_STATS.SET_TABLE_STATS(ownname=>USER, tabname=>'GTT_SESSION', numrows=>10000, numblks=>200);
-- 或啟用動態採樣
ALTER SESSION SET OPTIMIZER_DYNAMIC_SAMPLING = 4;

12c+ 可用 GLOBAL_TEMP_TABLE_STATS 偏好參數自動管理。

五、效能優勢實測對比

指標永久表 + 手動 DELETEGTT (事務級)
Redo 產生量高(完整記錄)極低(僅 Undo 元數據)
Undo 保留壓力大小
High Water Mark 移動頻繁不移動(截斷重置)
並發鎖衝突可能無(會話私有)

六、避坑清單

  1. 連接池環境:會話級 GTT 數據會隨連接複用殘留,**必須在邏輯結束時顯式 TRUNCATE/DELETE**
  2. 分布式事務:DB Link 參與的分布式事務不支援 GTT
  3. 備份/匯出:EXPDP 不導出 GTT 數據(結構可導)
  4. 權限:需 CREATE TABLE 權限,DROP ANY TABLE 可刪除他人 GTT 結構

七、總結

GTT 以「結構共享、數據隔離、零 Redo、自動清理」四大特性,完美契合臨時中間結果場景。**選型原則**:跨事務用會話級、單事務用事務級;生產環境優先靜態建表、配合動態採樣解決統計資訊問題;連接池場景務必加清理邏輯。

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