Db2

在 DB2 的大表中歸檔舊數據

  • November 18, 2019

我有一個非常大的非分區表,其中包含約 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;

您是否考慮過將表更改為範圍分區?

引用自:https://dba.stackexchange.com/questions/253527