快速,原子表更换

时间:2009-12-08 19:43:03

标签: sql-server-2005

我有一个相当简单的命令,偶尔会运行:

BEGIN TRAN T1;
truncate table mytable
insert into mytable select name from myview
COMMIT TRAN T1;

这个命令有两个丑陋的副作用:首先,mytable上的选择请求经常超时。其次,在mytable上选择请求有时不会返回任何结果。我不在乎它是否返回事务前结果或事后结果,但不希望它返回中间的任何内容,或者超时。我想到的一个解决方案,几乎肯定会有所帮助,首先将视图复制到临时表中(因为视图有点贵)。这不能完全解决问题,但它几乎肯定会使窗口缩小到足以使问题被忽略。坦率地说,窗口很窄,可以忽略它 now ,但我不喜欢忽略它。另一个解决方案是疯狂的过度工程,它将用两个表(例如双缓冲区)替换表,并调用最新的,填充正确的表。

是否有更优雅的方法用新的表替换表?

2 个答案:

答案 0 :(得分:7)

没有人会在中间看到任何东西。如果他们这样做,就意味着你正在做脏读,你应该得到你得到的每一个糟糕的结果。

您可以使用ALTER TABLE ... SWITCH PARTITION ...来“切换”另一个表的内容(必须具有相同的结构和约束)。操作是原子的,快速的,它简单地改变一些元数据指针,使内容“神奇地”移动到目标表中。见Transferring Data Efficiently by Using Partition Switching。源和目标都不需要显式“分区”表,切换操作也适用于普通的单分区表。

答案 1 :(得分:4)

有一种ALTER TABLE SWITCH技术,或者你可以使用sp_rename - 所有discussed in detail here