慢上表變量的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分鐘內運行。這是爲什麼?
慢上表變量的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分鐘內運行。這是爲什麼?
鏈接只有答案不是特別好的答案,並在Stack Overflow上不鼓勵。閱讀更多關於[這裏](https://stackoverflow.com/help/how-to-answer)(提供鏈接的上下文)和[這裏](http://meta.stackexchange.com/q/8231/273645 )。 –
看看執行計劃。我猜猜臨時表有更好的統計數據,所以'join'優化得更好。 –
在表變量中沒有與集羣鍵創建相關的統計信息,這可以從估計的行數值中看出。當數據更多時,這可能會很糟糕。就像@GordonLinoff提到的,如果你看到執行計劃,你將會在哪裏出現差異。 [這是](https://blogs.msdn.microsoft.com/naga/2015/05/10/sql-server-performance-tuning-table-variable-vs-temporary-tables/)博客解釋它爲什麼。您也可以嘗試使用「選項重建」。 –
您也可以嘗試使用'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回答解釋這一點。 –