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

T-SQL 臨時表完全指南:類型差異、效能優勢與進階陷阱

     編輯:關於SqlServer

臨時表是 T-SQL 開發中極常用的中間資料容器。本文系統整理區域/全域臨時表差異、效能優勢、存儲程序作用域陷阱、日誌/鎖定行為,助你避坑並用好這把利器。

一、兩種臨時表對比

特性區域臨時表 (#temp)全域臨時表 (##temp)
命名前綴###
可見性僅建立者的目前工作階段所有連線的工作階段皆可見
自動清除時機工作階段結束 (或存儲程序結束)建立者工作階段結束且無其他工作階段參考時
安全性高 (隔離性佳)低 (需防止命名衝突與資料洩露)

二、為何用臨時表?三大效能優勢

  1. 預處理/索引優化:將大表篩選後載入臨時表,於臨時表建立索引,後續多次 JOIN 查詢大幅加速。
  2. 減少中間實體表:避免建立永久暫存表再手動清理,降低資料庫雜訊與 DBA 維護負擔。
  3. 鎖定爭用極低:區域臨時表僅單一工作階段存取,無鎖衝突,DML 操作極快。

三、存儲程序作用域陷阱 (必讀)

區域臨時表在存儲程序內建立,屬於「子工作階段」,存儲程序結束即銷毀。 外層呼叫者無法直接讀取該臨時表。

CREATE PROC usp_Inner
AS
    CREATE TABLE #t (id INT);
    INSERT #t VALUES (1);
    -- 此處 #t 仍存在
GO

CREATE PROC usp_Outer
AS
    EXEC usp_Inner;
    SELECT * FROM #t; -- 錯誤:Invalid object name '#t'
GO

解法:在存儲程序輸出參數或結果集回傳資料,或改用全域臨時表 (需自行管理清理)。

四、日誌與鎖定行為

  • 最小日誌:臨時表 DML 僅記錄配頁/範圍變更,不記錄逐筆資料變更,大幅減少日誌量與 I/O。
  • 無鎖升級:區域臨時表不會觸發鎖升級 (Lock Escalation),高併發下穩定性優於永久表。
  • 風險:資料庫異常關機時,臨時表資料無法透過日誌復原,需由應用程式重算。

五、最佳實務建議

  1. 優先使用 區域臨時表,除非確需跨工作階段共享。
  2. 大量資料載入後立即建立索引 (叢集/非叢集),再進行後續 JOIN。
  3. 避免在長時間執行的交易中持有臨時表,防止 tempdb 版本存放區膨脹。
  4. 命名建議加入前綴區分模組:#sp_Sales_Detail、#etl_Stage_Customer。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved