SQL Server临时表上的性能开销

时间:2011-08-17 18:02:24

标签: sql sql-server performance

我经常使用临时表来简化数据加载(更容易调试,更清晰的select语句等)。如果性能需要它,我将创建一个物理表等。

我最近注意到我自动将临时表声明为全局(## temp_load)而不是本地(#temp_table)。我不知道为什么,但这是我多年来的习惯。我从不需要这些表是全局的,但我很好奇是否有额外的开销将它们创建为全局。我应该努力改变我的习惯。

是否存在使其全球化的其他风险?

1 个答案:

答案 0 :(得分:2)

几乎可以保证非全局临时表永远不会发生冲突。

全局临时表与具体化表类似,因为每个服务器的名称必须是唯一的。

通常情况下,只在必要时才使用##GLOBAL_TEMP表。

否则,如果您正在编写一个可以同时运行多次的proc,则procs将以不可预测的方式相互交互,使得排除故障非常困难 - Instance 1可以更改{ {1}}会导致Instance 2生成错误的结果。

我对Temp表的个人意见是我只在以下情况下使用它们:

  • 我有一个中到大的结果集(超过1米行)
  • 我需要索引结果集
  • 每次迭代过程我不需要多次使用该结果集
  • 我相信我不需要在任何时候恢复这个过程

我强调了最后一颗子弹,因为这是我尝试最小化临时表使用的主要原因:

如果您有一个长时间运行的进程,并且使用临时表来存储中间数据集,并且有90%的时间已经死亡,则必须完全重启如果该数据是大部分时间都不在物化表中。

我的一些进程在数十亿行数据上运行了几天,所以我对从头开始重新启动不感兴趣。