2011-08-17 170 views
1

我经常使用临时表来简化数据加载(更简单的调试,更简洁的选择语句等)。如果性能要求,我会创建一个物理表等。SQL Server临时表的性能开销

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

是否有额外的风险使其成为全球?

回答

2

非全局临时表几乎保证永远不会发生碰撞。

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

通常,只有在必要时才使用##GLOBAL_TEMP表。

否则,如果你正在写,可能我跑一次同时多一个进程,该特效将与不可预知的方式互相作用,使得它极难解决 - Instance 1可以改变的数据被用于由Instance 2导致Instance 3也会产生不正确的结果。

我对临时表的个人的看法是,当我只使用它们:

  • 我有一个中型到大型的结果集(超过100万行)
  • 我需要索引的ResultSet
  • 我不需要用每一次的过程中反复比结果集更
  • 我相信我不会需要恢复过程中的任何一点

我强调了最后一颗子弹,因为这是主要的原因,我尽量减少临时表的使用:

如果你有一个长期运行的进程,并使用临时表来存储中间数据集,以及什么东西死说90%的方式,你必须完全重新启动如果该数据大部分时间不在物化表中。

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

+0

有一些真棒点。碰撞问题在我写作我的问题时发生。谢谢! –

+1

我实际上还没有为全局##临时表找到一个很好的用例。这是一个修辞问题,但为什么不创建一个永久表,然后放下它?如果有任何事情死亡,您将获得相同的并发限制而不会丢失表。我想,你可能会争辩说这是好还是坏,就像你可以说枪伤比弩伤更好或更差一样。 –

+0

我认为物理表有额外的开销(日志记录,缓存)与临时表。这是错误的吗?我通常为小型(ish)数据集使用临时表。我主要是数据仓库(每天900万条事实记录)以及我的源代码阴影和分期都是物理的。我通常使用临时表进行一些简单的查找并支持连接。 –