Sql-Server-2005

INSERT 臨時表和表變數之間的性能差異

  • January 24, 2013

我在 SQL Server 2005 中有以下問題:與使用臨時表進行相同插入相比,嘗試將一些行插入表變數需要很多時間。

這是插入表變數的程式碼

DECLARE @Data TABLE(...)
INSERT INTO @DATA( ... )
SELECT ..
FROM ...

這是插入臨時表的程式碼

CREATE #Data TABLE(...)
INSERT INTO #DATA( ... )
SELECT ..
FROM ...
DROP TABLE #Data

臨時表沒有任何鍵或索引,兩個查詢之間的選擇部分相同,選擇返回的結果數約為 10000 行。單獨執行選擇所需的時間約為 10 秒。

臨時表版本最多需要 10 秒才能執行,我不得不在 5 分鐘後停止表變數版本。

我必須使用表變數,因為查詢是表值函式的一部分,不允許訪問臨時表。

表變數版本的執行計劃 執行計劃

臨時表版本的執行計劃 執行計劃

兩種方案的明顯區別在於,快的一個是並行的,而慢的一個是串列的。

這是插入表變數的計劃的限制之一。正如評論中提到的(似乎它具有預期的效果)你可以嘗試做

INSERT INTO @DATA ( ... ) 
EXEC('SELECT .. FROM ...')

看看是否可以繞過限制。

表變數有時較慢,因為沒有關於表變數的統計資訊,因此優化器總是假設只有一條記錄。

但是我不能保證這裡就是這種情況,您必須查看表變數查詢計劃中的“估計行”資訊。

引用自:https://dba.stackexchange.com/questions/13469