Oracle 全局臨時表(Global Temporary Table, GTT)的定義對所有會話可見,但數據僅對當前會話或事務可見。建表時不分配段,數據寫入臨時表空間(默認 TEMP),不產生 Redo 日志(僅產生少量 Undo),大幅降低臨時計算對主庫的負載。
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;
-- 會話 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 ROWS | ON COMMIT DELETE ROWS |
| 數據清空時機 | 會話結束 | COMMIT / ROLLBACK / 會話結束 |
| 跨事務保留 | 是 | 否 |
| 統計信息 | 12c+ 支持會話級統計 | 同上 |
| 索引/視圖/觸發器 | 支持(數據同樣隔離) | 支持 |
DBMS_STATS.GATHER_TABLE_STATS 收集會話級統計信息優化執行計劃。