測試環境上在反複做幾次更新後發現資料庫表空間的HWM比used pages 高出很多,是以嘗試降低高水位線。
開始網上搜尋資料講用runstats、reorg指令,各種嘗試後并不管用,後來又了解到db2dart指令,總算讓我看到了希望。
db2dart有三個選項:DHWM(Dump HWM)、LHWM(Lower HWM)、RHWM(Remove HWM) 摘抄自《DB2資料庫管理最佳實踐》
隻需使用LHWM選項就足夠了,該選項會提供降低HWM的建議,下面是使用方法:
db2dart dbname /lhwm (回車後會提示輸入需要操作的表空間id及期望的HWM值,表空間id可以通過db2 list tablespaces show detail指令檢視,期望值可以填used pages的值也可以填0)
以空格分隔輸入兩個參數後回車将會生成一個以資料庫名開頭的.RPT檔案,打開該檔案即可看到提供的幾條建議:
圖中提示先導出表ZJWEB.RUN_STATUS_TABLE的資料再重建該表,再将資料導入,需要注意的是,LHWM給出的建議并不能總是獲得預期的結果。
依照這幾條建議做完後發下HWM并沒有降低,之後又了解到alter table move指令,由于若index跟表在同一個表空間的話會使index變為UNUSABLE,是以沒有嘗試。
從圖書館借到《DB2資料庫管理最佳實踐》,裡面有詳細介紹降低高水位線的方法,其中db2dart 指令的使用跟我的操作是一樣的,但是從書中還了解到:表在離線重組(Reorg)時會保留原資料,同時在表空間内進行一份資料複制,當複制結束後删除原表資料塊。如果HWM下沒有足夠的空間儲存資料複制,則重組不但不能降低HWM,反而會導緻HWM增加。
看到這裡恍然大悟,我在每次操作完它的建議後都會reorg一次,而我們普遍用到reorg方式是離線方式(reorg table tabname),線上方式(reorg table tabname inplace allow write access)會記錄大量日志甚至是表大小的幾倍且速度較慢。
再次執行它的建議,先将表資料導出,再drop表後重新db2 list tablespaces show detail發現HWM已經降低到接近used pages 了,然後将表重建并導入資料。此時HWM已經跟used pages一緻了。