@table变量或#temp表:性能

时间:2011-07-25 09:51:08

标签: sql sql-server sql-server-2008 table-valued-parameters

我有一个用户定义的大型表格类型变量129 Columns 我会一次将2000-3000 Records存储在此变量中并将其传递给各种存储过程和函数以获取其他数据并在相同类型的新变量中进行修改并返回此新变量到源SP。(这是因为表类型参数只能传递为READONLY)。

这是我的算法。

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

        INSERT @tmp EXEC
        SP3 (@tmp)

  }

我应该使用哪一个@table varible#temp table

2 个答案:

答案 0 :(得分:3)

有一篇有用的文章here说:

像许多其他技术领域一样,这里没有“正确”的答案。对于不打算超出过程范围的数据,通常在#temp表和表变量之间进行选择。您的最终决定应取决于性能和合理的负载测试。随着您的数据量变大,和/或临时数据的重复使用增加,您会发现使用#temp表更有意义。根据您的环境,该阈值可能在任何地方 - 但如果上述任何限制代表重大障碍,您显然需要使用#temp表。

然而,另一种方法是使用真实表,其中您需要在任何事务中使用的行使用GUID列表示。然后,您必须仅将GUID作为参数传递,这可能会提高性能。但是,这可能不是您的选择。

我建议您只试用这两个选项并查看SQL Profiler,看看哪些选项可以提供最佳性能。

答案 1 :(得分:1)

如果将#tmp简单地用作临时存储数据的堆,那么我认为@ vs#不会产生影响,特别是对于只包含几千行的表。

唯一要记住的是,如果在某些时候你认为你需要索引表,那么临时表显然是选择,因为表变量不能被索引。

除此之外,有趣地说,我从未发现临时表的表现优于表变量,反之亦然。