我经常使用临时表来简化数据加载(更简单的调试,更简洁的选择语句等)。如果性能要求,我会创建一个物理表等。SQL Server临时表的性能开销
我最近注意到,我自动将临时表声明为全局(## temp_load),而不是本地(#temp_table)。我不知道为什么,但这是我多年来的习惯。我从来没有需要表是全球性的,但我很好奇,如果有创造他们作为全球性的额外开销。我应该努力改变我的习惯。
是否有额外的风险使其成为全球?
我经常使用临时表来简化数据加载(更简单的调试,更简洁的选择语句等)。如果性能要求,我会创建一个物理表等。SQL Server临时表的性能开销
我最近注意到,我自动将临时表声明为全局(## temp_load),而不是本地(#temp_table)。我不知道为什么,但这是我多年来的习惯。我从来没有需要表是全球性的,但我很好奇,如果有创造他们作为全球性的额外开销。我应该努力改变我的习惯。
是否有额外的风险使其成为全球?
非全局临时表几乎保证永远不会发生碰撞。
全局临时表与物化表类似,因为每个服务器的名称必须是唯一的。
通常,只有在必要时才使用##GLOBAL_TEMP
表。
否则,如果你正在写,可能我跑一次同时多一个进程,该特效将与不可预知的方式互相作用,使得它极难解决 - Instance 1
可以改变的数据被用于由Instance 2
导致Instance 3
也会产生不正确的结果。
我对临时表的个人的看法是,当我只使用它们:
我强调了最后一颗子弹,因为这是主要的原因,我尽量减少临时表的使用:
如果你有一个长期运行的进程,并使用临时表来存储中间数据集,以及什么东西死说90%的方式,你必须完全重新启动如果该数据大部分时间不在物化表中。
我的一些进程在数十亿行数据上运行了几天,所以我对从头开始重新启动并不感兴趣。
有一些真棒点。碰撞问题在我写作我的问题时发生。谢谢! –
我实际上还没有为全局##临时表找到一个很好的用例。这是一个修辞问题,但为什么不创建一个永久表,然后放下它?如果有任何事情死亡,您将获得相同的并发限制而不会丢失表。我想,你可能会争辩说这是好还是坏,就像你可以说枪伤比弩伤更好或更差一样。 –
我认为物理表有额外的开销(日志记录,缓存)与临时表。这是错误的吗?我通常为小型(ish)数据集使用临时表。我主要是数据仓库(每天900万条事实记录)以及我的源代码阴影和分期都是物理的。我通常使用临时表进行一些简单的查找并支持连接。 –