2016-11-22 50 views
1

慢上表變量的SQL更新我有類似:爲什麼比使用臨時表

DECLARE @tbl TABLE 
(
    name varchar(255), 
    type int 
) 

UPDATE c 
SET c.name = t.name 
FROM dbo.cars c 
JOIN @tbl t ON t.type = c.type 

我有一個存儲過程,做類似的事情,但它需要花費20分鐘用表變量。如果將其從表變量更改爲臨時表,它在不到2分鐘內運行。這是爲什麼?

+4

看看執行計劃。我猜猜臨時表有更好的統計數據,所以'join'優化得更好。 –

+0

在表變量中沒有與集羣鍵創建相關的統計信息,這可以從估計的行數值中看出。當數據更多時,這可能會很糟糕。就像@GordonLinoff提到的,如果你看到執行計劃,你將會在哪裏出現差異。 [這是](https://blogs.msdn.microsoft.com/naga/2015/05/10/sql-server-performance-tuning-table-variable-vs-temporary-tables/)博客解釋它爲什麼。您也可以嘗試使用「選項重建」。 –

+1

您也可以嘗試使用'OPTION RECOMPILE'進行表變量查詢,它將檢測基數並提高性能。 [Here is](http://dba.stackexchange.com/questions/16385/whats-the-difference-between-a-temp-table-and-table-variable-in-sql-server/16386#16386)good回答解釋這一點。 –

回答