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

Oracle 全局臨時表與 SQL Server 本地/全局臨時表架構差異深度解析:生命周期、存儲與共享機制

     編輯:Oracle 資料庫基礎

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 GTTSQL Server 臨時表
定義持久化是(數據字典)否(隨連接/引用消失)
存儲介質磁盤(臨時段)優先內存(tempdb)
事務級隔離支持不支持
跨會話共享不共享數據,僅共享定義全局表共享數據與定義
頻繁建刪性能保留定義避免開銷頻繁建刪影響 tempdb 爭用
模擬共享臨時數據永久表+用戶標識列+觸發器/視圖清理原生 ## 全局表

遷移建議

  • Oracle 無原生「內存臨時表」,高頻臨時計算可考慮 WITH 子查詢、PL/SQL 集合或 RESULT_CACHE。
  • 需跨會話共享中間結果時,Oracle 建議使用永久表配合會話標識列與自動清理機制。
  • SQL Server 遷移至 Oracle 時,將 #temp 改為會話級 GTT,##temp 改為帶會話標識的永久表。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved