SQL Server 存储过程中的表变量在插入时性能较差

11

我们在使用存储过程中的表变量时遇到了性能问题。

以下是实际发生的情况:

DECLARE @tblTemp TABLE(iId_company INT)

INSERT INTO @tblTemp(iId_company)
  SELECT id FROM .....

SELECT语句返回了138个结果,但是将它们插入表变量需要1分15秒,而使用相同SELECT的临时表只需要0秒:

CREATE TABLE #temp (iId_company INT)

INSERT INTO #temp(iId_company)
  SELECT id FROM ...

是什么原因导致这种行为?

4个回答

11
使用临时表。这样可以获得更好的性能。
详细解释超出了最初问题的范围,然而简要概括如下:
  • SQL Server将表变量优化为一行,即假设将返回1行。
  • 表变量不会创建统计信息。
Google“temp table Vs. table variable”可获取大量资源和讨论。如果需要具体帮助,请给我发送电子邮件或在Twitter上联系我。

0

通常情况下,对于较小的数据集,表变量应该比临时表更快。但是对于较大的数据集,性能会下降,因为表变量不支持并行处理(请参见this post)。

话虽如此,我没有经历过或发现在使用表变量和临时表处理如此小的数据集时,表变量比临时表慢的情况。


0

虽然这并不重要,但是你的SELECT是什么样子的?我在SQL Server 2005中遇到了一个问题,单独运行SELECT可以相对较快地执行查询,例如返回所有数据需要5分钟,大约15万行。但是当我尝试将相同的SELECT插入到临时表或表变量中时,该语句需要运行超过1小时,然后我取消了它。至今我还没有弄清楚到底发生了什么。最终,我添加了查询提示(force order),它开始更快地插入。


0
关于临时表的关键点是,您可以在其上放置索引等,而使用表变量则不行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接