1. 程式人生 > >db2 reorg優化及原因

db2 reorg優化及原因

reorgchk,檢查table index 是否需要重組。reorg 重組,重新放置資料位置。runstats 統計資訊,可以優化查詢器

一個完整的日常維護規範可以幫助 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命令的語法如下:

.                           -UPDATE STATISTICS--.

>>-REORGCHK--+--------------------+----------------------------->

                         '-CURRENT STATISTICS-'

            .-ON TABLE USER-----------------.

>--+-------------------------------+---------------------------><

            '-ON--+-SCHEMA--schema-name---+-'

                    | .-USER-------. | 

                    '-TABLE--+-SYSTEM-----+-' 

                       +-ALL--------+ 

                       '- table-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可以考慮分為表上有索引和沒有索引兩種情況:

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' );

'DB2ADMIN'

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 ;

--'DB2ADMIN'    56

4、構造優化指令碼

--=============================================================================

(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')

--=============================================================================

(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')

--=============================================================================

(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'

--=============================================================================

(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') ;