10

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

这是实际发生的情况:

DECLARE @tblTemp TABLE(iId_company INT)

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

SELECT 返回 138 个结果,但插入 TABLE 变量需要 1min15 但是当我使用具有相同 SELECT 的临时表时,woops 需要 0sec:

CREATE TABLE #temp (iId_company INT)

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

什么可能导致这种行为?

4

4 回答 4

10

使用临时表。您将看到更好的性能。

对此背后的原因的详细解释超出了最初问题的范围,但要总结一下:

  • SQL Server 为一行优化表变量,即它假定将返回 1 行。
  • 表变量不会创建统计信息。

谷歌临时表与。用于丰富资源和讨论的表变量。如果您随后需要具体帮助,请给我发一封电子邮件或在 Twitter 上与我联系。

于 2009-10-29T13:26:24.070 回答
0

通常,对于较小的数据集,表变量应该比临时表快。对于较大的数据集,性能会下降,因为表变量不支持并行性(参见这篇文章)。

话虽如此,我还没有经历过,或者发现这样一小组数据对于表变量与临时表相比速度较慢的经验。

于 2009-10-29T13:39:32.093 回答
0

没关系,但您的选择是什么样的?我在 SQL Server 2005 中遇到了一个问题,我自己的选择运行相对较快,因为我的查询在 5 分钟内通过网络返回了大约 150,000 行的所有数据。但是,当我尝试将相同的选择插入到临时表或表变量中时,该语句运行了 1 个多小时,然后才将其杀死。我还没有弄清楚到底发生了什么。我最终添加了查询提示强制顺序,它开始更快地插入。

于 2009-10-29T13:53:57.803 回答
0

关于临时表的关键点还在于您可以在它们上放置索引等,而不能使用表变量。

于 2009-10-29T22:15:52.617 回答