當數據庫里某個表中的記錄變化量很大時,需要在表上做REORG操作來優化數據庫性能。
值得注意的是,針對數據庫對象的大量操作,如反復地刪除表,存儲過程,會引起系統表中數據的頻繁改變,在這種情況下,也要考慮對系統表進行REORG操作。
由于DB2使用CBO作為數據庫的優化器,數據庫對象的狀態信息對數據庫使用合理的access PLAN至關重要。
一個完整的REORG表的過程應該是由下面的步驟組成的:
RUNSTATS -> REORGCHK -> REORG -> RUNSTATS -> BIND或REBIND
0 執行下面命令前要先連接數據庫
1 RUNSTATS
由于在第二步中REORGCHK時可以對指定的表進行RUNSTATS操作(在REORGCHK時指定UPDATE STATISTICS),所以第一步事實上是可以省略的。
2 REORGCHK
REORGCHK命令的語法如下:
>>-REORGCHK----+----------------------------+------------------->
| .-UPDATE--. |
'--+-CURRENT-+---STATISTICS--'
>-----+---------------------------+----------------------------><
| .-USER-------. |
'-ON TABLE--+-SYSTEM-----+--'
+-ALL--------+
'-table-name-'
REORGCHK是根據統計公式計算表是否需要重整。
對于每個表有3個統計公式,對索引有3個統計公式(版本8開始有5個公式),如果公式計算結果該表需重整,在輸出的REORG字段中相應值為*,否則為-。
如果數據庫中數據量比較大,在生產系統上要考慮REORGCHK的執行時間可能較長,需安排在非交易時間執行。
可以分為對系統表和用戶表兩部分分別進行REORGCHK:
1) 針對系統表進行REORGCHK
db2 reorgchk update statistics on table system
使用UPDATE STATISTICS參數指定數據庫首先執行RUNSTATS命令。
2) 針對用戶表進行REORGCHK
db2 reorgchk update statistics on table user
下面是執行的部分結果
db2 reorgchk update statistics on table user
執行 RUNSTATS ....
表統計信息:
F1: 100 * OVERFLOW / CARD < 5
F2: 100 * (Effective Space Utilization of Data Pages) > 70
F3: 100 * (Required Pages / Total Pages) > 80
SCHEMA NAME CARD OV NP FP ACTBLK TSIZE F1 F2 F3 REORG
----------------------------------------------------------------------------------------
DB2INST1 STAFF - - - - - - - - -*-
...
索引統計信息:
F4: CLUSTERRATIO 或正?;?CLUSTERFACTOR > 80
F5: 100 * (KEYS * (ISIZE + 9) + (CARD - KEYS) * 5) / ((NLEAF - NUM EMPTY LEAFS) * INDEXPAGESIZE) > 50
F6: (100 - PCTFREE) * ((INDEXPAGESIZE - 96) / (ISIZE + 12)) ** (NLEVELS - 2) * (INDEXPAGESIZE - 96) / (KEYS * (ISIZE + 9) + (CARD - KEYS) * 5) < 100
F7: 100 * (NUMRIDS DELETED / (NUMRIDS DELETED + CARD)) < 20
F8: 100 * (NUM EMPTY LEAFS / NLEAF) < 20
SCHEMA NAME CARD LEAF ELEAF LVLS ISIZE NDEL KEYS F4 F5 F6 F7 F8 REORG
-------------------------------------------------------------------------------------------------
表:DB2INST1.STAFF
DB2INST1 ISTAFF - - - - - - - - - - - - -----
...
從上面的例子來看,對于表DB2INST1.STAFF,根據統計公式F2計算結果,有必要對表進行REORG。
3 REORG TABLE
REORG TABLE命令的語法如下:
>>-REORG TABLE--table-name----+--------------------+------------>
'-INDEX--index-name--'
>-----+-----------------------+--------------------------------><
'-USE--tablespace-name--'
執行REORG可以考慮分為表上有索引和沒有索引兩種情況:
1) 如果表上有索引
如表名為DB2INST1.STAFF,索引名為DB2INST1.ISTAFF,命令如下:
db2 reorg table db2inst1.staff index db2inst1.istaff use tempspace1
建議REORG時使用USE參數指定數據重排時使用的臨時表空間,否則,REORG工作將會在表所在表空間中原地執行。
如果表上有多個索引,INDEX參數值請使用最為重要的索引名。
2) 如果表上沒有索引
如表名為DB2INST1.STAFF, SYSIBM.SYSTABLES
db2 reorg table db2inst1.staff use tempspace1
db2 reorg table sysibm.systables use tempspace1
4 RUNSTATS
RUNSTATS命令的語法如下:
>>-RUNSTATS ON TABLE--table-name-------------------------------->
>-----+-+--------------------------------------------------------------------+-+>
| '-WITH DISTRIBUTION--+--------------------------------------------+--' |
| '-AND--+----------+--+-INDEXES ALL--------+--' |
| '-DETAILED-' '-INDEX--index-name--' |
'-+--------------------------------------------------+-------------------'
'--+-AND-+---+----------+--+-INDEXES ALL--------+--'
'-FOR-' '-DETAILED-' '-INDEX--index-name--'
>-----+--------------------------+-----------------------------><
| .-CHANGE----. |
'-SHRLEVEL--+-REFERENCE-+--'
如果表名為DB2INST1.STAFF,表上有索引,則可以用下面的例子完成RUNSTATS命令:
db2 runstats on table db2inst1.staff with distribution and detailed indexes all
5 (可選) 上面命令完成后可以重復第二步,檢查REORG的結果,如果需要,可以再次執行REORG和RUNSTATS命令。
6 BIND或REBIND
RUNSTATS命令運行后,應對數據庫中的PACKAGE進行重新聯編,簡單地,可以使用db2rbind命令來完成。
db2rbind命令的語法如下:
>>-db2rbind--database--/l logfile----+------+------------------->
'-all--'
.-conservative--.
>-----+-------------------------+--/r--+-any-----------+-------><
'-/u userid--/p passWord--'
例如,如果數據庫名為SAMPLE,執行:
db2rbind sample -l db2rbind.out
新聞熱點
疑難解答