【轉】DB2日常維護——REORG TABLE命令優化數據庫性能
一個完整的日常維護規范可以幫助 DBA 理順每天需要的操作,以便更好的監控和維護數據庫,
保證數據庫的正常、安全、高效運行,防止一些錯誤重復發生。
由於DB2使用CBO作為數據庫的優化器,數據庫對象的狀態信息對數據庫使用合理的 ACCESS PLAN至關重要。
DB2 優化器使用目錄統計信息來確定任何給定查詢的最佳訪問方案。如果有關表或索引的統計信息已過時或者不完整,
則會導致優化器選擇不是最佳的方案,並且會降低 執行查詢的速度。當數據庫里某個表中的記錄變化量很大時,
需要在表上做REORG操作來優化數據庫性能
一、完整的REORG表的過程
值得注意的是,針對數據庫對象的大量操作,如反復地刪除表,存儲過程,會引起系統表中數據的頻繁改變,
在這種情況下,也要考慮對系統表進行REORG操作。一個完整的REORG表的過程應該是由下面的步驟組成的:
RUNSTATS -> REORGCHK -> REORG -> RUNSTATS -> BIND或REBIND
注: 執行下面命令前要先連接數據庫
1 RUNSTATS
由於在第二步中REORGCHK時可以對指定的表進行RUNSTATS操作(在REORGCHK時指定UPDATE STATISTICS),
所以第一步事實上是可以省略的。
2 REORGCHK
在對表數據進行許多更改之后,邏輯上連續的數據可能會位於不連續的物理數據頁上,在許多插入操作創建了溢出記錄時尤其如此。
按這種方式組織數據時,數據庫管理器必須執行其他讀操作才能訪問順序數據。另外,在刪除大量行后,也需要執行其他的讀操作。
表重組操作會整理數據碎片來減少浪費的空間,並對行進行重新排序以合並溢出記錄,從而加快數據訪問速度並最終提高查詢性能。
還可以指定根據特定索引來重新排序數據,以便查詢時通過最少次數據讀取操作就可以訪問數據。
下列任何因素都可能指示用戶應該重組表:
1)自上次重組表之后,對該表進行了大量的插入、更新和刪除活動 。
2)對於使用具有高集群率的索引的查詢,其性能發生了明顯變化 。
3)在執行 RUNSTATS 命令以刷新統計信息后,性能沒有得到改善。
4)REORGCHK 命令指示需要重組表
(注意:在某些情況下,REORGCHK 總是建議重組表,即使在執行了重組后也是如此)。例如,如果使用 32KB 頁大小,
並且平均記錄長度為 15 字節且每頁最多包含 253 條記錄,則每頁具有 32700- (15 x 253)=28905 個未使用字節。
這意味着大約 88% 的頁面是可用空間。用戶應分析 REORGCHK 的建議並針對執行重組所需的成本平衡利益。
5)db.tb_reorg_req(需要重組)運行狀況指示器處於 ATTENTION 狀態。
此運行狀況指示器的集合詳細信息描述通過重組可獲得好處的表和索引的列表。
REORGCHK 命令返回有關數據組織的統計信息,並且可以建議您是否需要重組特定表。
然而,定期或在特定時間對目錄統計信息表運行特定查詢可以提供性能歷史記錄,該記錄使用戶可以發現可能具有更廣性能隱含的趨勢。
DB2 V9.1 引入了自動重組功能,可以對表和索引進行自動重組。自動重組通過使用 REORGCHK 公式來確定何時需要對表進行重組。
它會定期評估已經更新了統計信息的表,以便了解是否需要重組。
REORGCHK命令的語法如下:
REORGCHK UPDATE|CURRENT STATISTICS ON TABLE USER|SYSTEM|ALL|table-name
UPDATE STATISTICS TABLE USER|SYSTEM|ALL|table-name
>>-REORGCHK--+-------------------->ON ----+------------
CURRENT STATISTICS SCHEMA schema-name
下面我們來看一下各個選項的含義:
UPDATE STATISTICS:更新表的統計數據,根據該統計數據判斷是否需要重組表。
CURRENT STATISTICS:根據當前表統計數據判斷是否需要重組表。
TABLE table_name:對單個表進行分析。
TABLE ALL:對數據庫所有的表進行分析。
TABLE SYSTEM:對系統表進行分析。
TABLE USER:對當前用戶模式下的所有表進行分析。
如果數據庫中數據量比較大,在生產系統上要考慮REORGCHK的執行時間可能較長,需安排在非交易時間執行。
可以分為對系統表和用戶表兩部分分別進行REORGCHK:
1) 針對系統表進行REORGCHK
db2 reorgchk update statistics on table system
使用UPDATE STATISTICS參數指定數據庫首先執行RUNSTATS命令。
2) 針對用戶表進行REORGCHK
db2 reorgchk update statistics on table user
REORGCHK是根據統計公式計算表是否需要重整。對於每個表有3個統計公式,對索引有3個統計公式(版本8開始有5個公式),
如果公式計算結果該表需重整,在輸出的REORG字段中相應值為*,否則為-。
reorgchk 所使用的度量的考慮因素包括:
(當查看 reorgchk 工具的輸出時,找到用於表的 F1、F2 和 F3 這幾列,以及用於索引的 F4、F5、F6、F7 和 F8 這幾列。
如果這些列中的任何一列有星號 (*),則說明當前的表和/或索引超出了閾值。)
F1: 屬於溢出記錄的行所占的百分比。當這個百分比大於 5% 時,在輸出的 F1 列中將有一個星號 (*)。
F2: 數據頁中使用了的空間所占的百分比。當這個百分比小於 70% 時,在輸出的 F2 列上將有一個星號 (*)。
F3: 其中含有包含某些記錄的數據的頁所占的百分比。當這個百分比小於 80% 時,在輸出的 F3 列上將有一個星號 (*)。
F4: 群集率,即表中與索引具有相同順序的行所占的百分比。當這個百分比小於 80% 時,那么在輸出的F4 列上將有一個星號 (*)。
F5: 在每個索引頁上用於索引鍵的空間所占的百分比。當這個百分比小於 50% 時,在輸出的 F5 列上將有一個星號 (*)。
F6: 可以存儲在每個索引級的鍵的數目。當這個數字小於 100 時,在輸出的 F6 列上將有一個星號 (*)。
F7: 在一個頁中被標記為 deleted 的記錄 ID(鍵)所占的百分比。當這個百分比大於 20% 時,在輸出的 F7 列上將有一個星號 (*)。
F8: 索引中空葉子頁所占的百分比。當這個百分比大於 20% 時,在輸出的 F8 列上將有一個星號 (*)。
下面是執行的部分結果
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)
DB2 V9 可以對表和索引進行自動重組。要進行高效率的數據訪問和獲得最佳工作負載性能,具有組織良好的表數據是很關鍵的。
在對表數據進行許多更改之后,邏輯上連續 的數據可能會位於不連續的物理數據頁上,在許多插入操作創建了溢出記錄時尤其如此。
按這種方式組織數據時,數據庫管理器必須執行其他讀操作才能訪問順序數 據。另外,在刪除大量行后,也需要執行其他的讀操作。
表重組操作會整理數據碎片來減少浪費的空間,並對行進行重新排序以合並溢出記錄,從而加快數據訪問速 度並最終提高查詢性能。
還可以指定根據特定索引來重新排序數據,以便查詢通過最少次數據讀取操作就可以訪問數據。
既可重組系統目錄表,也可以重組數據庫 表。由 RUNSTATS 收集的統計信息與其他信息一起來顯示表中的數據分布情況。
特別是,通過分析這些統計信息可以知道何時需要執行哪種類型的重組。自動重組通過使用 REORGCHK 公式來確定何時需要對表進行重組。
它會定期評估已經更新了統計信息的表,以便了解是否需要重組。如果需要重組,則它會在內部調度對表進行傳統重組。
這將要 求執行應用程序功能而不對正在重組的表進行寫訪問。
可以使用 auto_reorg、auto_tbl_maint 和 auto_maint 數據庫配置參數來啟用或禁用自動重組功能部件。
在分區數據庫環境中,確定執行自動重組和啟動自動重組是在目錄分區上完成的。
只需要在目錄分區上啟用數據庫 配置參數,就將在目標表所在的所有數據庫分區上運行重組。
如果用戶不太確定何時以及如何重組表和索引,則可以將自動重組作為整個數據庫維護方案的一部分。
如果是 DB2 V8.2.2 以前的版本,是沒有自動重組功能的。
如果你的數據庫是 DB2 V8.2.2 以前的版本,或者想在 DB2 V8.2.2 以后的版本里手工運行重組表,可以使用命令完成。
手工重組可以使用 REORG 命令來完成。
以脫機方式重組表是整理表碎片的最快方法。重組可減少表所需的空間量並提高數據訪問和查詢性能。
必須具有 SYSADM、SYSCTRL、SYSMAINT 或 DBADM 權限,或者必須具有對表的 CONTROL 權限才能重組表。必須具有數據庫連接才能重組表。
標識需要重組的表之后,可以對這些表運行 REORG 實用程序,並且可以選擇對在這些表上定義的任何索引運行該實用程序。
REORG TABLE命令的語法如下:
REORG TABLE table-name [INDEX index-name] [USE tablespace-name]
>>-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
使用 REORG TABLE 命令重組 RHETTE.TEST 表
C:\> db2 reorg table rhette.test
DB20000I REORG 命令成功完成。
要使用臨時表空間 TEMPSPACE1 重組表 RHETTE.TEST,可以在 DB2CLP 窗口中使用帶 USE TEMPSPACE1 選項的 REORG TABLE 命令。
使用臨時表空間 TEMPSPACE1 重組 RHETTE.TEST 表
C:\> db2 reorg table rhette.test use TEMPSPACE1
DB20000I REORG 命令成功完成。
下面我們在示例表 TEST 上創建一個索引 A1,構建在 ID 列上。此時我們想要重組表並根據索引 A1 對行進行重新排序,可以使用帶 INDEX 選項的 REORG TABLE 命令。
根據索引 A1 重組 RHETTE.TEST 表
C:\> db2 create index a1 on rhette.test(id)
DB20000I SQL 命令成功完成。
C:\> db2 reorg table rhette.test index a1
DB20000I REORG 命令成功完成。
如果想使用 SQL 調用語句重組表,請使用 ADMIN_CMD 過程發出 REORG TABLE 命令。
使用 SQL 調用語句重組 RHETTE.TEST 表
C:\> db2 call sysproc.admin_cmd ( 'reorg table rhette.test index a1' )
返回狀態 = 0
要使用 DB2 管理 API 重組表,請使用 db2REORG API 。
在重組表之后,應收集有關表的統計信息,以便優化器具有最准確的數據來評估查詢訪問方案。
另外,記住在分區數據庫環境中,如果想在所有節點運行命令,需要使用 db2_all 命令。
通過刪除和插入操作對表進行更新后,索引的性能會降低,其表現方式如下:
1)葉子頁分段。
葉子頁被分段之后,由於必須讀取更多的葉子頁才能訪存表頁,因此 I/O 操作成本會增加。
2)物理索引頁的順序不再與這些頁上的鍵順序相匹配(此稱為不良集群索引)。
葉子頁出現不良集群情況后,順序預取操作的效率將降低,因此會導致更多的 I/O 等待。
3)形成的索引大於其最有效的級別數。
在此情況下應重組索引。
如果在創建索引時設置了 MINPCTUSED 參數,則在刪除某個鍵且可用空間小於指定的百分比時,數據庫服務器會自動合並索引葉子頁。
此過程稱為聯機索引整理碎片。但是,要復原索引集群和可用空間以及降低葉級別,請使用下列其中一種方法:
1)刪除並重新創建索引。
2)使用 REORG INDEXES 命令聯機重組索引。
因為此方法允許用戶在重建表索引期間對表進行讀寫操作,所以在生產環境中可能需要選擇此方法。
3)使用允許脫機重組表及其索引的選項運行 REORG TABLE 命令。
在使用 ALLOW WRITE ACCESS 選項運行 REORG INDEXES 命令時,如果同時允許對指定的表進行讀寫訪問,則會重建該表的所有索引。
進行重組時,對基礎表所作的任何將會影響到索引的更改都將記錄在 DB2 日志中。另外,如果有任何內部內存緩沖區空間可供使用,則還將這些更改放在這樣的內存空間中。
重組將處理所記錄的更改以便在重建索引時與當前寫活動保持同 步更新。
內部內存緩沖區空間是根據需要從實用程序堆中分配的指定內存區域,它用來存儲對正在創建或重組的索引所作的更改。
使用內存緩沖區空間使索引重組操 作能夠通過這樣的方式來處理更改,即先直接從內存讀取,然后讀取日志(如有必要),但讀取日志的時間要晚得多。
在重組操作完成后,將釋放所分配的內存。重 組完成后,重建的索引可能不是最佳集群的索引。如果為索引指定 PCTFREE,則在重組期間,每頁上均會保留相應百分比的空間。
對於分區表,支持對各個索引進行聯機索引重組和清除。要對各個索引進行重組,指定索引名:REORG INDEX index_name for TABLE table_name
對於空間索引或多維集群(MDC)表,不支持采用 ALLOW WRITE 方式的聯機索引重組。
注: REORG INDEXES 命令的 CLEANUP ONLY 選項不能完全重組索引。 CLEANUP ONLY ALL 選項將除去那些標記為“刪除”且被認為要落實的鍵。
此外,它還將釋放所有標記為“刪除”且被認為要落實的鍵所在的頁。在釋放頁后,相鄰的葉子頁將會合並, 前提是這樣做可以在合並頁上至少留出 PCTFREE 可用空間。
PCTFREE 是指在創建索引時為其定義的可用空間百分比。 CLEANUP ONLY PAGES 選項僅刪除那些標記為“刪除”且被認為要落實的所有鍵所在的頁。
使用 CLEANUP ONLY 選項對分區表的索引進行重組時,支持任何訪問級別。如果未指定 CLEANUP ONLY 選項,則缺省訪問級別 ALLOW NO ACCESS 是唯一支持的訪問級別。
REORG INDEXES 具有下列要求:
1)對索引和表具有 SYSADM、SYSMAINT、SYSCTRL 或 DBADM 權限,或者具有 CONTROL 特權。
2)用於存儲索引的表空間的可用空間數量等於索引的當前大小
在發出 CREATE TABLE 語句時,考慮在大型表空間中重組索引。
3)其他日志空間
REORG INDEXES 需要記錄其活動。因此,重組可能會失敗,尤其是在系統繁忙和記錄其他並發活動時。
注: 如果具有 ALLOW NO ACCESS 選項的 REORG INDEXES ALL 命令運行失敗,則會標記索引無效並且此項操作不可撤銷。
但是,如果具有 ALLOW READ ACCESS 選項的 REORG 命令或具有 ALLOW WRITE ACCESS 選項的 REORG 命令運行失敗,則可以復原原來的索引對象。
另外還需要注意,在 DB2 V9 開放平台上對新引入的表分區功能來說,不能聯機重組分區表。
4.對表和索引進行 runstats
DB2 優化器使用目錄統計信息來確定任何給定查詢的最佳訪問方案。
如果有關表或索引的統計信息已過時或者不完整,則會導致優化器選擇不是最佳的方案,並且會降低 執行查詢的速度。
但是,決定要為給定的工作負載收集哪些統計信息是很復雜的事情,並且使這些統計信息保持最新是一項很花費時間的任務。
以往,建議對一個頻繁進行大量更新、插入或者刪除操作的表進行 RUNSTATS,建議在重組表之后運行 RUNSTATS 。
我們都是通過手工執行 RUNSTATS 命令,或者通過 DB2 任務中心調度執行 RUNSTATS 命令來收集表的統計信息以改善數據庫性能。
現在 DB2 V9 又新增了自動收集統計信息功能, 自動收集統計信息通過收集最新的表統計信息來改善數據庫性能。
DB2 首先確定工作負載需要哪些統計信息以及需要更新哪些統計信息,然后,在后台自動調用 RUNSTATS 實用程序以確保收集並維護正確的統計信息。
然后,DB2 優化器根據准確的統計信息來選擇訪問方案。
從 IBM DB2 版本 9.1 開始,在創建新的數據庫時,缺省情況下會啟用自動收集統計信息(RUNSTATS)功能。
這表示 DB2 數據庫管理器將確定是否需要更新數據庫統計信息。然后,RUNSTATS 實用程序會根據需要在后台自動運行,以確保最新的數據庫統計信息可用。
用戶在創建數據庫之后,可以通過將數據庫配置參數 AUTO_RUNSTATS 設置為 OFF 來禁用自動收集統計信息。
需要注意的是,將數據庫從版本 8 遷移到版本 9.1 時,不會自動啟用此功能。要在已遷移的數據庫中使用此功能,必須手工進行啟用。
通過使用自動統計信息收集功能,可以讓 DB2 確定是否需要更新數據庫統計信息。
在啟用了自動統計信息收集功能的情況下,DB2 將自動在后台運行 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-+--'
如果沒有啟用自動統計信息功能,那么我們還需要手工對需要的表和索引使用 runstats 命令,更新統計信息。
比如想對 TEST 表和索引運行統計信息,發出“ runstats on table test and index all ” 。
對表 TEST 以及索引更新統計信息
C:\> db2 runstats on table rhette.test and index all
DB20000I RUNSTATS 命令成功完成。
收集索引統計信息以允許優化器評估是否應該使用索引來解析查詢。
如果想收集索引統計信息,必須連接至包含表和索引的數據庫並具有下列其中一個權限級別:sysadm 、sysctrl 、sysmaint 、dbadm 、對表的 CONTROL 特權 。
帶 SAMPLED DETAILED 選項執行 RUNSTATS 命令需要 2MB 統計信息堆。將附加的 488 個 4K 頁分配給為此附加內存需求設置的 stat_heap_sz 數據庫配置參數。
如果該堆看起來太小,則 RUNSTATS 在嘗試收集統計信息之前會返回一條錯誤。
現在我們在 DB2CLP 窗口中,連上示例數據庫 SAMPLE,在示例數據庫中存在表 RHETTE.PROJECT,其有兩個索引 PK_PROJE CT 和 XPROJ2,
我們要創建索引 PK_PROJE CT 和 XPROJ2 的詳細統計信息,可以發出帶 AND DETAILED INDEXES ALL 選項的 RUNSTATS 命令。
創建索引 PK_PROJECT 和 XPROJ2 的詳細統計信息
C:\> db2 RUNSTATS ON TABLE rhette.project AND DETAILED
INDEXES ALL DB20000I RUNSTATS 命令成功完成。
如果我們想創建兩個索引的詳細統計信息,但是不想耗費太多的資源和時間,可以使用采樣的方式而不是對每個索引條目執行詳細計算。
創建索引 PK_PROJECT 和 XPROJ2 的詳細統計信息,使用采樣方式
C:\> db2 RUNSTATS ON TABLE rhette.project AND SAMPLED DETAILED
INDEXES ALL DB20000I RUNSTATS 命令成功完成。
如果要創建索引上的詳細采樣統計信息以及表的分布統計信息,以便索引和表統計信息一致,可以使用帶 WITH DISTRIBUTION 選項的 RUNSTATS 命令。
收集表 rhette.project 的詳細統計信息
C:\> db2 RUNSTATS ON TABLE rhette.project WITH DISTRIBUTION ON KEY COLUMNS AND SAMPLED DETAILED
INDEXES ALL DB20000I RUNSTATS 命令成功完成。
如果想全面收集表和索引的信息,而不是使用抽樣的方式收集表 rhette.project 的詳細統計信息
C:\> db2 RUNSTATS ON TABLE rhette.project WITH DISTRIBUTION AND DETAILED
INDEXES ALL DB20000I RUNSTATS 命令成功完成。
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
二、DB2 V8.2 如何配置AUTO_RUNSTATS
1.配置參數
首先確保DBM參數HEALTH_MON是ON,
然后使用如下命令打開AUTO_RUNSTATS 的開關。
db2 update db cfg using AUTO_MAINT ON AUTO_TBL_MAINT ON AUTO_RUNSTATS ON
2.設置需要自動RUNSTATS的表的profile,該profile會紀錄於系統表sysibm.systables的STATISTICS_PROFILE列
例如:
db2 runstats on table huangdk.hasales and indexes all tablesample system(20) set profile only
說明:a.RUNSTATS的語法見《命令指南》
http://publib.boulder.ibm.com/in ... c/core/r0001980.htm
b.tablesample 是采樣runstats的選項,例子里采用system的方法,采樣20%
3.AUTO_RUNSTATS觸發條件
配置完后,需要重起一下實例,然后系統會在第一次連接請求時,去觸發AUTO_RUNSTATS,如果表需要RUNSTATS,就開始RUNSTATS。
以后,系統每隔3小時觸發AUTO_RUNSTATS
用戶可以使用以下語句檢查:
db2 select STATS_TIME,SUBSTR(STATISTICS_PROFILE,1,200) from sysibm.systables
其中,STATS_TIME列指示最后一次RUNSTATS的時間。
另外,db2diag.log里有這樣的信息:
2004-10-27-16.08.39.007000+480 I30117H327 LEVEL: Event
PID : 2596 TID : 3404 PROC : db2fmp.exe
INSTANCE: DB2 NODE : 000
FUNCTION: DB2 UDB, Automatic Table Maintenance, db2HmonEvalStats, probe:100
START : Automatic Runstats: evaluation has started on database TBCSAMPL
指示自動RUNSTATS已經運行。
三、優化語句的批量獲取
1、查找數據庫管理表空間(DMS)
SELECT TBSpace FROM syscat.tablespaces WHERE TBSpaceType = 'D' ;
2、DMS下的creator(用戶、模式)
SELECT DISTINCT creator FROM sysibm.systables WHERE tbspace IN (SELECT TBSpace FROM syscat.tablespaces WHERE TBSpaceType = 'D' );
3、creator下的表數量
SELECT creator,count(1) FROM sysibm.systables WHERE Type = 'T' AND tbspace IN (SELECT TBSpace FROM syscat.tablespaces WHERE TBSpaceType = 'D') GROUP BY creator ;
4、構造優化腳本
--檢查reorgchk
(1).reorgchk update statistics on table SCHEMA.TABLE ;
select 'reorgchk update statistics on table DB2ADMIN.'||rtrim(name)||';' from sysibm.systables where creator = 'DB2ADMIN' AND Type = 'T' AND tbspace IN (SELECT TBSpace FROM syscat.tablespaces WHERE TBSpaceType = 'D')
--重組表 reorg table
(2).reorg table SCHEMA.TABLE ;
select 'reorg table DB2ADMIN.'||rtrim(name)||';' from sysibm.systables where creator = 'DB2ADMIN' AND Type = 'T' AND tbspace IN (SELECT TBSpace FROM syscat.tablespaces WHERE TBSpaceType = 'D')
--重組索引 reorg indexes
(3).reorg indexes all for table SCHEMA.TABLE ;
select 'reorg indexes all for table DB2ADMIN.'||rtrim(name)||';' from sysibm.systables where creator = 'DB2ADMIN' AND Type = 'T' AND tbspace IN (SELECT TBSpace FROM syscat.tablespaces WHERE TBSpaceType = 'D'
--更新統計 runstats
(4).runstats on table SCHEMA.TABLE and indexes all;
select 'runstats on table DB2ADMIN.'||rtrim(name)||' and indexes all;' from sysibm.systables where creator = 'DB2ADMIN' AND Type = 'T' AND tbspace IN (SELECT TBSpace FROM syscat.tablespaces WHERE TBSpaceType = 'D') ;