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

表變數與暫存表:特性比較與選擇指南

     編輯:關於SqlServer

核心差異速查表

特性表變數 (@table)暫存表 (#temp)
儲存位置記憶體(資料量大時溢寫 tempdb)tempdb(磁碟)
作用域批次/預存程序/函數結束自動清除工作階段結束或手動 DROP 清除
交易與鎖定僅在更新期間持有鎖,不受外部交易回滾影響完整支援交易、回滾、鎖升級
統計資料無統計資料,優化器假設 1 列有統計資料,支援重新編譯與最佳化
索引/約束僅支援 PRIMARY KEY、UNIQUE(隱含索引)支援所有索引、外鍵、檢查約束
動態 SQL 可見性不可在 EXEC/sp_executesql 內部存取外部表變數全域暫存表 (##temp) 可跨工作階段存取
參數傳遞可作為 TABLE 型參數傳入預存程序(SQL 2008+)不可作為參數傳遞

選擇建議

  • 小資料量(< 1 萬列)、頻繁呼叫的預存程序/觸發器 → 表變數,低延遲、無重編譯。
  • 大資料量、複雜查詢、需索引最佳化、跨交易一致性 → 暫存表,統計資料與索引支援較好。
  • 需在動態 SQL 間共享資料 → 全域暫存表 ##temp。
  • Table-Valued Parameter 傳遞結構化資料 → 必須使用表變數型別。

常見誤區

  1. 「表變數永遠在記憶體」:資料量超過記憶體壓力時會分頁到 tempdb,與暫存表無異。
  2. 「表變數不支援索引」:可透過 PRIMARY KEY/UNIQUE 約束建立叢集/非叢集索引。
  3. 「暫存表一定比表變數慢」:大資料量時暫存表因統計資料反而更快。

最佳實踐

-- 表變數範例
DECLARE @t TABLE (id INT PRIMARY KEY, val VARCHAR(20));
INSERT INTO @t SELECT id, name FROM dbo.BigTable WHERE id < 100;

-- 暫存表範例(預先建立索引)
CREATE TABLE #t (id INT PRIMARY KEY, val VARCHAR(20));
CREATE INDEX IX_#t_val ON #t(val);
INSERT INTO #t SELECT id, name FROM dbo.BigTable WHERE id < 1000000;

結語

理解兩者在儲存、統計、鎖定、作用域上的本質差異,依據資料量、查詢複雜度、併發需求靈活選擇,才能發揮最佳效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved