2016-11-22 71 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回答解释这一点。 –

回答