我創建了一個需要每小時插入/更新的非規格化表格。從數據的角度來看,這個過程相當複雜,所以我正在尋找一種推薦的方式來更新表格而不會中斷用戶。將表格行從一個表格移動到另一個表格的最有效方式
我想要一個單獨的表,我的過程插入/更新和一旦完成,需要一種方法將這些更改推送到我的現場製作表。
任何幫助將是偉大的!
我創建了一個需要每小時插入/更新的非規格化表格。從數據的角度來看,這個過程相當複雜,所以我正在尋找一種推薦的方式來更新表格而不會中斷用戶。將表格行從一個表格移動到另一個表格的最有效方式
我想要一個單獨的表,我的過程插入/更新和一旦完成,需要一種方法將這些更改推送到我的現場製作表。
任何幫助將是偉大的!
另一種解決方案是使用多個模式和播放開關-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用於訪問報告表。
一個解決方案是使用您提到的臨時表來完成,然後將其名稱更改爲生產表名稱(但首先將生產表重命名爲其他名稱)。之後,您可以放棄前一張製作表。當然,你應該在交易中完成所有這些。
所以,這將是:
-- Fill tmpTable
--
-- Do renaming
begin tran t1;
execute sp_rename 'productionTable', 'productionTableBackup';
execute sp_rename 'tmpTable', 'productionTable';
commit tran t1;
SQL Server的哪個版本/版本? – 2012-02-08 01:48:56
SQL Server 2008 – Marco 2012-02-08 01:50:51
2008或2008 R2?哪個版本? – 2012-02-08 01:52:43