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

Oracle 全局臨時表詳解:會話級與事務級特性實戰演示

     編輯:Oracle 資料庫基礎

什麼是全局臨時表?

Oracle 全局臨時表(Global Temporary Table, GTT)的定義對所有會話可見,但數據僅對當前會話或事務可見。建表時不分配段,數據寫入臨時表空間(默認 TEMP),不產生 Redo 日志(僅產生少量 Undo),大幅降低臨時計算對主庫的負載。

兩種生命週期類型

1. 會話級(ON COMMIT PRESERVE ROWS)

  • 數據在會話結束時自動清空(TRUNCATE)。
  • 提交/回滾事務不影響數據保留。
  • 不同會話互不干擾,各自見自己的數據。
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;

2. 事務級(ON COMMIT DELETE ROWS)

  • 數據在事務提交或回滾時自動清空。
  • 會話結束同樣清空。
  • 適合單事務內的中間結果暫存。
CREATE GLOBAL TEMPORARY TABLE classes (
  class_id   NUMBER(5),
  class_name VARCHAR2(8),
  class_memo VARCHAR2(200)
) ON COMMIT DELETE ROWS;

實戰演示:會話級臨時表行為驗證

-- 會話 A 插入三條記錄
INSERT INTO student VALUES (1, 1, '張三', '福建');
INSERT INTO student VALUES (2, 1, '劉德華', '福州');
INSERT INTO student VALUES (3, 2, 'S.H.E', '廈門');
COMMIT;  -- 數據仍保留

SELECT * FROM student;
-- 輸出 3 行

-- 會話 A 繼續插入
INSERT INTO student VALUES (4, 2, '張惠妹', '廈門');
SELECT * FROM student;
-- 輸出 4 行

-- 會話 B 同一時刻查詢
SELECT * FROM student;
-- 輸出 0 行(數據隔離)

-- 會話 A 斷開連接 → 數據自動清空

關鍵特性總結

特性會話級事務級
語法ON COMMIT PRESERVE ROWSON COMMIT DELETE ROWS
數據清空時機會話結束COMMIT / ROLLBACK / 會話結束
跨事務保留是否
統計信息12c+ 支持會話級統計同上
索引/視圖/觸發器支持(數據同樣隔離)支持

最佳實踐建議

  • 複雜報表的中間聚合結果 → 會話級 GTT,配合 DBMS_STATS.GATHER_TABLE_STATS 收集會話級統計信息優化執行計劃。
  • 單一事務內的多步驟 ETL 中間表 → 事務級 GTT,自動清理無需手動 TRUNCATE。
  • 避免在高併發 OLTP 核心鏈路長時間持有會話級 GTT 大量數據,以免擠佔 TEMP 表空間。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved