在百萬級以上資料量的 Oracle 系統中,多表關聯查詢常面臨效能挑戰。當關聯大表後結果集極小且查詢極快時,全域暫存表(GTT)是極佳選擇。GTT 不佔用永久表空間,資料存放於系統暫存表空間 (TEMP),用完即釋放。
TRUNCATECREATE GLOBAL TEMPORARY TABLE Student (
Stu_id NUMBER(5),
Class_id NUMBER(5),
Stu_Name VARCHAR2(8),
Stu_Memo VARCHAR2(200)
) ON COMMIT PRESERVE ROWS;
COMMIT 或 ROLLBACK 即自動清空CREATE GLOBAL TEMPORARY TABLE Classes (
Class_id NUMBER(5),
Class_Name VARCHAR2(8),
Class_Memo VARCHAR2(200)
) ON COMMIT DELETE ROWS;
| 特性 | 工作階段級 | 交易級 |
|---|---|---|
| 保留條款 | ON COMMIT PRESERVE ROWS | ON COMMIT DELETE ROWS |
| 資料清空時機 | Session 結束 | COMMIT/ROLLBACK 或 Session 結束 |
| 跨交易可見性 | 可見 | 不可見 |
-- 1. 建立一般表,主鍵加入 SessionID
CREATE TABLE my_temp_table (
session_id NUMBER PRIMARY KEY, -- 區分不同 Session
col1 VARCHAR2(100),
col2 CLOB, -- 支援 LOB
CONSTRAINT fk_ref FOREIGN KEY (ref_id) REFERENCES ref_table(id) -- 支援外鍵
);
-- 2. 建立登出觸發器,自動清理當前 Session 資料
CREATE OR REPLACE TRIGGER cleanup_temp_on_logoff
BEFORE LOGOFF ON DATABASE
BEGIN
DELETE FROM my_temp_table WHERE session_id = SYS_CONTEXT('USERENV', 'SID');
END;
-- 3. 應用層寫入/讀取時自動帶入 SessionID
-- INSERT: session_id = SYS_CONTEXT('USERENV', 'SID')
-- SELECT: WHERE session_id = SYS_CONTEXT('USERENV', 'SID')