慢上表变量的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回答解释这一点。 –