2009-12-08 74 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