为什么表变量上的SQL更新比临时表慢

为什么表变量上的SQL更新比临时表慢,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有点像: 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 我有一个执行类似操作的存储过程,但使用table变量需要20分钟以上。如果我将它从表变量更改为临时表,它将在不到2分钟内运行。为什么会这样?我认为这个答案对你很有帮助 我建议你看看这个链接 我认为这个答案对你

我有点像:

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

我有一个执行类似操作的存储过程,但使用table变量需要20分钟以上。如果我将它从表变量更改为临时表,它将在不到2分钟内运行。为什么会这样?

我认为这个答案对你很有帮助

我建议你看看这个链接


我认为这个答案对你很有帮助

我建议你看看这个链接


查看执行计划。我猜临时表具有更好的统计信息,因此
连接
得到了更好的优化。从估计的行数值可以看出,表变量中没有与聚集键创建相关的统计信息。当数据更多时,这可能是不好的。就像上面提到的@GordonLinoff,如果你看到执行计划,你会发现区别在哪里。一个博客解释了原因。您还可以尝试使用
选项重新编译
。您还可以尝试使用
选项重新编译
进行表变量查询,这将检测基数并提高性能。很好的回答解释了这一点。看看执行计划。我猜临时表具有更好的统计信息,因此
连接
得到了更好的优化。从估计的行数值可以看出,表变量中没有与聚集键创建相关的统计信息。当数据更多时,这可能是不好的。就像上面提到的@GordonLinoff,如果你看到执行计划,你会发现区别在哪里。一个博客解释了原因。您还可以尝试使用
选项重新编译
。您还可以尝试使用
选项重新编译
进行表变量查询,这将检测基数并提高性能。很好的答案解释了这一点。仅链接的答案不是特别好的答案,不鼓励堆栈溢出。请阅读更多相关内容(为链接提供上下文)和。仅链接的答案不是特别好的答案,不建议在堆栈溢出时使用。阅读更多相关信息(提供链接的上下文)和。