データベース - IBM DB2 - REORG TABLE

クラウディア 
1. REORG TABLE って?
2. REORGCHK (REORG TABLE の必要性を確認する)
3. REORGCHK の結果の見方
4. REORG TABLE 構文
5. REORG TABLE 権限

1. REORG TABLE って?

 「Oracle」でいう「ANALYZE」コマンドに相当するのかなぁと思っていたが、モノの資料によれば、それは「RUNSTATS」と書いてあるし・・・。  「巨人 IBM」のサイトによれば、「REORG」とは
・フラグメンテーションの解消
・オーバーフロー・レコードの解消
・索引のキー順でデータを配置
 という効果があるそうです。  「ALTER TABLE」等により、テーブルの構成を変更したときにはそのあとにやっておくべきもののようです。  本ページは、下記のサイトを参考にさせていただきました。
MadCap DB2 - テーブル・インデックスの再編成またはクリーンアップ」
「DB2 勉強する : REORG (データの再編成)

2. REORGCHK (REORG TABLE の必要性を確認する)

 なんか、データベースに関してはド素人なのでヘンなこと言っちゃってるかなぁ。  「Oracle」で「ANALYZE」を行うと統計情報を更新するのですが、それを行うとアクセスが速くなるって実感があったのです。  だがしかし、実際には「ANALYZE」では統計情報を更新しているだけ?  「db2」では、統計情報を更新するのが「RUNSTATS ...」。  で「RUNSTATS」で更新して、統計を出力するのが。

db2 CONNECT TO データベース名
以下のコマンドです。

db2 REORGCHK [CURRENT STATISTICS] 対象指定
 「CURRENT STATISTICS」のオプションをつけると現在の統計情報でチェックするし、つけないと「RUNSTATS」を実行して、統計情報の更新を行った上でチェックするようです。  対象の指定方法は以下のものがあるようです。
  指定     対象  
ON TABLE USER 接続しているユーザが所有するテーブル
ON SCHEMA スキーマ名 指定スキーマのテーブル
ON TABLE スキーマ名.テーブル名 指定したテーブル
ON TABLE SYSTEM システムテーブル
ON TABLE ALL すべてのテーブル
 テーブル名指定以外は、恐ろしく時間のかかる覚悟が必要です。  また、解析結果は標準出力に出力されて、流れて見えなくなるので

db2 コマンド > ファイル名
 でリダイレクトした方が良さそうです。  全テーブルを見るには。

db2 reorgchk current statistics on table all

3. REORGCHK の結果の見方

 「REORGCHK」の結果は以下のように出力されます。

RUNSTATS 中	・・・

		・・・

SCHEMA.NAME                     CARD     OV     NP     FP ACTBLK    TSIZE  F1  F2  F3 REORG
----------------------------------------------------------------------------------------
表: スキーマ名.テーブル名
                             5750310      0  35939  38515      - 2.88e+08   0  91  93 ---
----------------------------------------------------------------------------------------

索引統計:

		・・・

SCHEMA.NAME                 INDCARD  LEAF ELEAF LVLS  NDEL    KEYS LEAF_RECSIZE NLEAF_RECSIZE LEAF_PAGE_OVERHEAD NLEAF_PAGE_OVERHEAD  PCT_PAGES_SAVED  F4  F5  F6  F7  F8 REORG
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
表: スキーマ名.テーブル名
索引: スキーマ名.インデックス名
                            5750310 25776     0    3 97580 5750310           19            19                674                 674                0   1  86   0   1   0 *----
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

		・・・

 省略している部分が多いですが、実際は、開業はむちゃくちゃだし、全然整形されたものではありません。(単に横が長いのではみ出しているということではありません)  天下の「大 IBM」にしてはお粗末な出力で、笑ってしまいますが・・・。  注視すべきは、REORG の下に表示される、「-」または「*」の文字で。  テーブルでは3文字分、インデックスでは4文字分あります。  この文字が「-」であれば、適正範囲の値で、「*」であれば、最適化を要するということになります。

4. REORG TABLE 構文


REORG TABLE テーブル名 [INDEX インデックス名];
 が基本構文になります。  どうも「INDEX ...」はつけて、テーブルとインデックスを同時に更新する方が効率がよいようです。

5. REORG TABLE 権限

 あるテーブルの OWNER から「REORG TABLE」を実行したら「SQL2214N このユーザー ID は、表 "" に対して REORG ユーティリティーを実行する権限を持っていません。」というエラーが表示されました。  「GRANT ALL」で権限がついているのに?  調べてみたら、「GRANT ALL」ではつかない「CONTROL」権限というものが必要なそうで・・・。

GRANT CONTROL ON テーブル名;
 を行う必要があるのでした。
ハイスピードプラン