SQL Server 2000的临时表与表变量

3

在存储一些临时数据(一个中有50K行,另一个也有50K行)以执行某些计算时,什么方法更有效?我将每晚执行此过程。

如何在比较此类内容时检查效率?

2个回答

6

结果将因存储数据的方式而异,是在磁盘上(#temp)还是在内存中(@temp)更容易。

以下是来自下面参考文献的几个摘录:

  • 创建临时表并将其填充到磁盘上,在系统数据库tempdb中。
  • 表变量在内存中创建,因此比#temp表执行得稍微好一些(也因为表变量中锁定和日志记录更少)。表变量可能仍然对tempdb执行I/O操作(这就是#temp表的性能问题显现出来的地方),尽管文档没有非常明确地说明。
  • 与临时表相比,表变量导致存储过程重新编译的次数更少。
  • 您可以在临时表上创建索引以提高查询性能。

关于您具体的情况,有50k行:

随着数据大小的增加和/或临时数据的重复使用增加,您会发现使用#temp表更有意义。

参考文献:


根据我的经验,对于表变量来说50K可能过大了,但我没有确切的数据来支持这一点。通常我会尽量保持表变量小于5K。 - brendan
3
你可以在 # 表格上创建额外的索引,但在 vars 上则不行。 - Joe
1
当你往临时变量中输入足够的数据时,它也会溢出到磁盘上,50000行数据将部分地推入磁盘。 - SQLMenace
谢谢你的留言,乔。我添加了一个关于索引的注释。 - boflynn
临时表索引的两个好处:
  • 这些可以是非唯一的(而表变量仅通过约束唯一)
  • 但最大的优势来自意想不到的盟友:统计信息是“廉价”的索引,查询优化器(pstatman)会自动在临时表上创建这些索引-- 这会产生很大的差异。
- wqw
-1 表变量不存储在内存中,而是存储在 tempdb 中。 - Gabriel McAdams

3
使用表变量和临时表之间可能存在很大的性能差异。在大多数情况下,临时表比表变量更快。我从私人SQL Server MVP新闻组中获得了以下提示,并获得了Microsoft的许可与您分享。一位MVP注意到,虽然使用表变量的查询在大型SMP框中没有生成并行查询计划,但在相同情况下运行的使用临时表(本地或全局)的类似查询确实生成了并行计划。

更多来自SQL Mag(不幸的是需要订阅,我会尽快找到更多资源)

编辑:这里有更详细的信息来自CodeProject


谢谢你的提示。我在发布这个问题后看到了CodeProject的文章。 - Saif Khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接