@table_variable或#temp_table


11

我有一个具有129列的大用户定义表类型变量。我将一次在此表变量中存储大约2000-3000条记录,并将其传递给各种存储过程和函数以获取其他数据并进行修改。然后,这些其他数据和新的修改将存储在相同类型的新表变量中,并通过OUTPUT参数返回到源存储过程。(这是因为表类型参数只能作为传递READONLY。)

这是我的伪代码:

  SP1
  @tmp tableType
  {
        INSERT @tmp EXEC
        SP2 (@tmp)

        INSERT @tmp EXEC
        SP3 (@tmp)
  }

我应该使用a @table_variable还是#temp_table


Answers:


12

您应该查看两个博客。第一个(这里)是表变量和临时表的比较。它来自2008年,并且与SQL Server 2008 R2仍然相关。

第二个博客条目(此处)处理有关表变量的一些误解(遗漏概念);包括索引表变量。

这两个博客条目(文章)均由Gail Shaw撰写。

我相信您正在寻找的一个有说服力的项目是表变量可能不会在存储过程之间传递,而临时表却能够在存储过程之间传递。表变量最接近存储过程之间传递的形式是用户定义的表类型。

将表变量作为TVP传递给存储过程需要将其定义为READ-ONLY参数。这意味着如果您要返回表变量的修改后的副本,将有多个表变量。

总而言之,当您想返回带有更新值的传入结构时,临时表可能会更好地服务于存储过程之间的传递。


5

没有比尝试两者更好的方法了,但是一旦您进入数百条记录,我发现#tempTables的性能会更好。


3
此外,临时表可以具有索引,统计信息,而表变量只能具有PK。你在这里有一些细节。
玛丽安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.