@table_variable 或 #temp_table

Sre*_*r P 12 performance sql-server-2008 sql-server

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

这是我的伪代码:

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

        INSERT @tmp EXEC
        SP3 (@tmp)
  }
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*ler 12

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

第二篇博文(这里)处理一些关于表变量的误解(missed-conceptions);包括索引表变量。

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

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

将表变量作为 TVP 传递给存储过程的要求必须将其定义为只读参数。这意味着如果您想返回表变量的修改副本,将会有多个表变量副本。

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


Sql*_*CID 5

没有什么比同时尝试更好的了,但我发现一旦您进入数百条记录,#tempTables 的性能会更好。

  • 此外,临时表可以有索引、有统计信息,而表变量只能有一个 PK。你有一些细节[这里](http://dba.stackexchange.com/questions/3968/how-to-improve-performance-by-using-or-not-using-table-variables/3969#3969)。 (3认同)