2012-04-06 30 views
1

爲了增加報告的響應時間,我創建了一個類似物化視圖的彙總表。我還沒有確定多久我會刷新數據,因爲我仍然決定如何實際交換數據。快速刷新彙總數據以最大限度地減少停機時間

基於密鑰更新數據不是當前結構的選項,因爲每條記錄都是由許多列的不同組合創建的,其中一些列可以爲空。這會導致更新在涉及空值時匹配多行。數據僅在數據庫中每天更新一次或兩次,因此實際上不需要經常更新它。

正如我目前設置,我的存儲過程只是截斷彙總表中的數據,然後立即重新運行查詢從頭開始重新填充。由於我從數百萬條記錄中抽出,這可能需要一些時間。是否有一種標準的做法可以非常快速地替換大型數據集以最大限度地減少數據的停機時間?就像將新的彙總數據加載到臨時表中,然後在查詢結束後將其移動到彙總表中,可能是什麼?

回答

2

這裏有一些數據庫功夫我已經習慣瞭解決這類問題的良好效果:使用簡單的數據驅動開關在當前版本和下一版本數據之間進行切換。

下面是一些用於演示此操作的SQL。

創建一個表某處按住開關(你可以在這裏使用任何東西 - 如果你有一個設置表等):

create table data_switch(val int not null); // this will hold one row 

其次,改變你的數據表有數據版本號列:

alter table my_data add column data_version int; 

最後,創建鏈接兩個使該設定數據的使用data_version值驅動的圖:

create view current_data as 
select * from my_data 
where data_version = (select val from data_switch); 

當您生成數據時,爲data_version指定一個新值。準備好使用它時,只需更新data_switch中的值以匹配您使用的新值。

這允許您保留舊版本,如果新版本損壞就切換回來,只要需要計算新數據即可,只要需要就截斷舊版本,並且可以在各版本之間瞬時切換。這很簡單,它的工作原理。

你可以改變你如何實現這個,但這是一般的想法。

+0

令人敬畏的技術。謝謝! – 2012-04-06 01:49:12

相關問題