2009-12-08 78 views
2

我有一个相当简单的命令,我偶尔运行:快速,原子表替换

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

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

是否有一个更优雅的方式来替换一个新的表?

+0

您使用的是什么事务隔离级别? – mwigdahl 2009-12-08 19:49:01

+0

我不知道如何设置它或我正在使用什么。 – Brian 2009-12-08 21:11:57

回答

7

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

您可以使用ALTER TABLE ... SWITCH PARTITION ...来切换另一个表格的内容(必须具有相同的结构和约束)。该操作尽可能原子化且快速,它简单地修改了一些元数据指针,以便内容“神奇地”移动到目标表中。请参阅Transferring Data Efficiently by Using Partition Switching。源和目的地都不需要明确的“分区”表,交换机操作也可以在普通的单分区表上工作。

+0

+1 - 用于分区切换。 – 2009-12-08 20:00:09