在 DB2 的大表中歸檔舊數據
我有一個非常大的非分區表,其中包含約 4,500,000,000 條記錄:ODS.LARGE_TABLE。
該表儲存了 3 個月的數據,每天約 50,000,000 行,因此總共有約 4,500,000,000 條記錄。
我的目標是將最早月份(即九月)的記錄歸檔到另一個新表 ODS.LARGE_TABLE_old。
1.) 我的第一種方法是將舊記錄載入到 ODS.LARGE_TABLE_old,然後在 ODS.LARGE_TABLE 中刪除它們。載入步驟很好,但刪除步驟有問題,因為在這個大表中刪除這麼多記錄會導致事務日誌已滿錯誤。
我知道最初可以將表更改為未記錄以避免此問題,但在我的情況下這似乎是有風險的,因為刪除操作的任何中斷都會使表無法訪問,而且我沒有這個大表的任何備份副本。
2.)我的第二種方法可能聽起來很愚蠢,但它不涉及刪除操作。我首先將ODS.LARGE_TABLE重命名為ODS.LARGE_TABLE_tmp,然後創建2個新表:ODS.LARGE_TABLE和ODS_LARGE_TABLE_old,我將舊記錄從ODS.LARGE_TABLE_tmp載入到ODS.LARGE_TABLE_old;從 ODS.LARGE_TABLE_tmp 將其餘記錄(即 10 月和 11 月)載入到 ODS.LARGE_TABLE,最後,我刪除了表 ODS.LARGE_TABLE_tmp。
我認為這種方法的缺點是第二次載入操作花費了我很多時間,因為它涉及 2 個月的載入數據。
我的問題是,是否有任何最佳實踐/方法可以從 DB2 LUW 的大表中歸檔舊記錄?我正在尋找一種有效的方法來做到這一點,這樣我就可以在我的所有大表中應用相同的方法。
提前致謝。
您可以嘗試ADMIN_MOVE_TABLE常式將您的表轉換為線上分區的範圍。使用
COPY_USE_LOAD
選項來加快程序並避免過多的日誌記錄。
我使用了類似於您的方法的方法:
declare c1 cursor for select ... from ODS.LARGE_TABLE where ts <= ...; -- data to remove load from c1 of cursor insert into ODS.LARGE_TABLE_old; create table ODS.LARGE_TABLE_tmp like ODS.LARGE_TABLE; declare c2 cursor for select ... from ODS.LARGE_TABLE where ts > ...; -- data to keep load from c2 of cursor insert into ODS.LARGE_TABLE_tmp; declare c3 cursor for select ... from ODS.LARGE_TABLE_tmp; load from c2 of cursor replace into ODS.LARGE_TABLE; drop table ODS.LARGE_TABLE_tmp;
您是否考慮過將表更改為範圍分區?