REORG TABLE命令優化數據庫性能

【轉】DB2平常維護——REORG TABLE命令優化數據庫性能 
    一個完整的平常維護規範能夠幫助 DBA 理順天天須要的操做,以便更好的監控和維護數據庫,
保證數據庫的正常、安全、高效運行,防止一些錯誤重複發生。
    因爲DB2使用CBO做爲數據庫的優化器,數據庫對象的狀態信息對數據庫使用合理的 ACCESS PLAN相當重要。
DB2 優化器使用目錄統計信息來肯定任何給定查詢的最佳訪問方案。若是有關表或索引的統計信息已過期或者不完整,
則會致使優化器選擇不是最佳的方案,而且會下降 執行查詢的速度。當數據庫裏某個表中的記錄變化量很大時,
須要在表上作REORG操做來優化數據庫性能數據庫

1、完整的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 工具的輸出時,找到用於表的 F一、F2 和 F3 這幾列,以及用於索引的 F四、F五、F六、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。性能

三、對須要重組的表進行重組(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 命令成功完成。ui

下面咱們在示例表 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 命令成功完成。lua

若是想使用 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 參數,則在刪除某個鍵且可用空間小於指定的百分比時,數據庫服務器會自動合併索引葉子頁。
此過程稱爲聯機索引整理碎片。可是,要復原索引集羣和可用空間以及下降葉級別,請使用下列其中一種方法:spa

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

2、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已經運行。

3、優化語句的批量獲取
一、查找數據庫管理表空間(DMS)
SELECT TBSpace FROM syscat.tablespaces WHERE TBSpaceType = 'D' ;

二、DMS下的creator(用戶、模式)
SELECT DISTINCT creator FROM sysibm.systables WHERE tbspace IN (SELECT TBSpace FROM syscat.tablespaces WHERE TBSpaceType = 'D' );

三、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 ;

四、構造優化腳本
--檢查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') ;

相關文章
相關標籤/搜索