Oracle 全局臨時表(GTT)
兩種生命周期
- 事務級:
ON COMMIT DELETE ROWS。Commit/Rollback 即清空數據。
- 會話級:
ON COMMIT PRESERVE ROWS。會話結束才清空。
特性
- 定義持久化於數據字典,數據僅對當前會話/事務可見。
- 每個會話擁有獨立數據副本,無需 DML 鎖。
- 支持索引、視圖、觸發器(均為臨時屬性)。
- 會話異常結束或實例崩潰時自動
TRUNCATE 清理。
創建示例
-- 事務級
CREATE GLOBAL TEMPORARY TABLE admin_work_area
(startdate DATE, enddate DATE, class CHAR(20))
ON COMMIT DELETE ROWS;
-- 會話級
CREATE GLOBAL TEMPORARY TABLE admin_work_area
(startdate DATE, enddate DATE, class CHAR(20))
ON COMMIT PRESERVE ROWS;
SQL Server 臨時表
本地臨時表(#)
- 存儲於
tempdb,內存優先,屬於「內存表」。
- 僅創建連接可見,斷開連接自動刪除(含定義)。
- 存儲過程創建時,內部追加數字後綴區分同名表。
全局臨時表(##)
- 所有連接可見,最後一個引用連接斷開時自動刪除。
- 多連接共享同一塊內存區域。
創建示例
CREATE TABLE #MyTempTable (cola INT PRIMARY KEY);
INSERT INTO #MyTempTable VALUES (1);
核心差異對比
| 維度 | Oracle GTT | SQL Server 臨時表 |
| 定義持久化 | 是(數據字典) | 否(隨連接/引用消失) |
| 存儲介質 | 磁盤(臨時段) | 優先內存(tempdb) |
| 事務級隔離 | 支持 | 不支持 |
| 跨會話共享 | 不共享數據,僅共享定義 | 全局表共享數據與定義 |
| 頻繁建刪性能 | 保留定義避免開銷 | 頻繁建刪影響 tempdb 爭用 |
| 模擬共享臨時數據 | 永久表+用戶標識列+觸發器/視圖清理 | 原生 ## 全局表 |
遷移建議
- Oracle 無原生「內存臨時表」,高頻臨時計算可考慮
WITH 子查詢、PL/SQL 集合或 RESULT_CACHE。
- 需跨會話共享中間結果時,Oracle 建議使用永久表配合會話標識列與自動清理機制。
- SQL Server 遷移至 Oracle 時,將
#temp 改為會話級 GTT,##temp 改為帶會話標識的永久表。