2012-02-08 69 views
2

我創建了一個需要每小時插入/更新的非規格化表格。從數據的角度來看,這個過程相當複雜,所以我正在尋找一種推薦的方式來更新表格而不會中斷用戶。將表格行從一個表格移動到另一個表格的最有效方式

我想要一個單獨的表,我的過程插入/更新和一旦完成,需要一種方法將這些更改推送到我的現場製作表。

任何幫助將是偉大的!

+0

SQL Server的哪個版本/版本? – 2012-02-08 01:48:56

+0

SQL Server 2008 – Marco 2012-02-08 01:50:51

+0

2008或2008 R2?哪個版本? – 2012-02-08 01:52:43

回答

4

另一種解決方案是使用多個模式和播放開關-A-Roo的。我只是喜歡這種方法,因爲我曾經在一份工作中做這個技巧,並且關於重命名一個對象的警告消息(不能被壓制)填滿了我的歷史日誌。基本上你需要兩個額外的模式(一個臨時保存表副本,一個保存緩存副本)。

CREATE SCHEMA cache AUTHORIZATION dbo; 
CREATE SCHEMA hold AUTHORIZATION dbo; 

如今,在高速緩存架構創建一個模擬表:

SELECT * INTO cache.table FROM dbo.table WHERE 1 = 0; 
-- then create any indexes etc. 

現在,當談到時間刷新數據:

-- step 1: 
TRUNCATE TABLE cache.table; 
-- (if you need to maintain FKs you may need to delete) 
INSERT INTO cache.table SELECT ... 

-- step 2: 
-- this transaction will be almost instantaneous, 
-- since it is a metadata operation only: 

BEGIN TRANSACTION; 
    ALTER SCHEMA hold TRANSFER dbo.table; 
    ALTER SCHEMA dbo TRANSFER cache.table; 
    ALTER SCHEMA cache TRANSFER hold.table; 
COMMIT TRANSACTION; 

從理論上說,你可以移動因爲用戶可能在第二次傳輸後開始查詢dbo.table的新副本,但正如我所說的,這是almos瞬間的,所以如果你看到併發的不同,我會感到驚訝。

您也可以在此處再次選擇截斷cache.table,但我總是保持填充狀態,以便可以比較數據更改或在出現問題時進行故障排除。取決於步驟1需要多長時間,反向執行傳輸可能會比從頭開始重新進行傳輸更快。

和重命名一樣,你可以從這個過程中得到不可思議的東西,比如當統計數據隨着實際表移動而丟失時,他們不會使用名字。和重命名一樣,您需要對此進行測試,並且您可能想要使用隔離級別進行遊戲。 RCSI用於訪問報告表。

2

一個解決方案是使用您提到的臨時表來完成,然後將其名稱更改爲生產表名稱(但首先將生產表重命名爲其他名稱)。之後,您可以放棄前一張製作表。當然,你應該在交易中完成所有這些。

所以,這將是:

-- Fill tmpTable 
-- 

-- Do renaming 
begin tran t1; 
execute sp_rename 'productionTable', 'productionTableBackup'; 
execute sp_rename 'tmpTable', 'productionTable'; 
commit tran t1; 
相關問題