5

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

这是我的算法。

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

        INSERT @tmp EXEC
        SP3 (@tmp)

  }

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

4

2 回答 2

4

这里有一篇有用的文章说:

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

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

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

于 2011-07-25T12:46:28.483 回答
2

如果#tmp仅将其用作临时存储数据的堆,那么我认为 @ 与 # 不会有所不同,尤其是对于仅包含几千行的表。

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

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

于 2011-07-25T12:27:46.420 回答