Sql-Server-2005
INSERT 臨時表和表變數之間的性能差異
我在 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 ...')
看看是否可以繞過限制。
表變數有時較慢,因為沒有關於表變數的統計資訊,因此優化器總是假設只有一條記錄。
但是我不能保證這裡就是這種情況,您必須查看表變數查詢計劃中的“估計行”資訊。