RUNSTATS ユーティリティーは、照会最適化プロセス処理のために、 システム・カタログ表内の統計を更新します。 それらの統計がないと、データベース・マネージャーが、 SQL ステートメントのパフォーマンスを低下させるような決定を下す可能性があります。 RUNSTATS ユーティリティーを使うと、表、索引、 または表と索引の両方に入っているデータに関する統計を収集することができます。
表データと索引データの両方に基づく統計を収集して、 以下の状況においてアクセス・プラン選択プロセスに対し正確な情報を提供するには、 RUNSTATS ユーティリティーを使います。
区分データベースで処理を行う場合には、 単一ノードで RUNSTATS 操作を実行することによって、表とその索引に関連する統計を収集します。 (ユーティリティーを実行するノードは、 コマンドを出すノードに表データが含まれているか否かによって決まります。 詳細については、RUNSTATS を実行するデータベース区画を参照してください。) カタログに保管されている統計は表レベルの情報を表すので、 データベース・マネージャーによって収集されたノード・レベルの統計に、 必要に応じて、表の区分化先のノード数を乗算します。 これによって、 各ノードで RUNSTATS を実行してその結果を集計して得られる実際の統計の近似値を求めることができます。
注: | DB2 照会最適化プログラムは、属性値 (データ) が、 システムのデータベース区画全体に等量かつ均等に入っていると想定しています。 データの配置が均等ではなかった場合には、 代表的な表分配がなされていると考えられるデータベース区画に対して、 このコマンドを実行する必要があります。 |
ある表上で RUNSTATS を起動する場合は、 表を保管するデータベースに接続する必要はありますが、 コマンドを出すデータベース区画には必ずしもその表の区画が含まれていなくてもかまいません。
統計を分析すると、再編成が必要であることがわかる場合があります。 それは、次のようなことに表れます。
クラスター率の統計が収集される場合、値は 0 〜 100 の範囲です。 クラスター係数の統計が収集される場合、値は 0 と 1 の間です。 この 2 つのクラスター統計のうち 1 つが SYSCAT.INDEXES カタログに記録されます。 一般に、クラスター化率が高くなるのは表内の 1 つの索引だけです。 値 -1 は、使用可能な統計がないことを示す場合に使います。
クラスター化率の値を比較する場合は、クラスター係数に 100 を乗算して、 クラスター化された量のパーセント値を求めてください。
索引専用アクセスではない索引走査は、 クラスター率が高い方がよくなることがあります。 クラスター率が低いと、この種の走査では各データ・ページの最初のアクセスの後、 次にアクセスが行われるまでバッファー・プール内にページが残っている可能性が少なくなるため入出力が増えます。 バッファー・サイズを大きくすると、 クラスター化されていない索引のパフォーマンスが向上することがあります。 (データベース・マネージャーでクラスター率の低い索引の索引走査パフォーマンスを向上させる方法については、リスト事前取り出しについて、 また最適化プログラムが索引統計を使用する方法については、クラスター索引を参照してください。)
特定の索引に関して表データが最初にクラスター化されていて、 上記のクラスター化に関する情報から、 この索引に関するデータのクラスター化が不十分であることがわかった場合は、 表を再編成して、その索引に関するデータを再クラスター化することができます。
オーバーフローの数は、元のページに収まらない行の数を示しています。 オーバーフローは、VARCHAR 列が現行より長い値で更新された場合に起きることがあります。 この場合、ポインターは行の元の位置のままになっています。 これはパフォーマンスに悪い影響を与える可能性があります。 データベース・マネージャーはポインターに従って行の内容を検出しなければならないので、 それにより処理時間が長くなり、入出力の回数が多くなる可能性もあるためです。
オーバーフロー行の数が多いほど、表データを再編成する方が効果的である可能性が高くなります。 表データを再編成すると、オーバーフロー行は除去されます。
行の含まれているページの数を、 表に含まれているページの合計数と比較することができます。 空ページを読み取って表走査することができます。 行の範囲が全部削除されると、空ページが生じることがあります。
空ページの数が多いほど、表を再編成する必要が大きくなります。 表を再編成すると、空ページを再利用するので、 表に使われるスペースの量を圧縮できます。 未使用ページを再利用すると、 ディスク・スペースを有効利用できるだけでなく、 バッファー・プール中で読み取られるページ数が減るので、 表走査のパフォーマンスを向上させることもできます。
葉ページの数は、索引の完全な走査に必要な索引ページ入出力の回数を予測したものです。
ランダム更新アクティビティーによりページ分割が行われ、 必要なスペースの最少量よりも索引のサイズが大きくなります。 表の再編成中に索引を再作成すると、 各索引を使用できるスペースの最少量で作成することができます。 索引の最小スペース要件については、 照会最適化に対する索引付けの影響または、 管理の手引き: 計画 の『索引、索引の拡張、または索引の指定の作成』というセクションを参照してください。
注: | 索引の再作成を行う場合、省略時値により、 各索引ページあたり 10% の空きスペースが残っています。 最初に索引を作成する時に、PCTFREE パラメーターを使用して空きスペースの量を増やすことができます。 そうすれば、索引を再編成するたびに PCTFREE 値が使用されます。 空きスペースを 10 パーセント以上にすることは、 索引を再編成しなければならない回数を減らしたい場合は重要です。 空きスペースは、追加の索引挿入を受け入れるのに使用されます。 |
RUNSTATS は、 データベースの変更とパフォーマンスの関係を調べるのにも役立ちます。 統計は、表内でのデータ分布を示します。 RUNSTATS を規則的に使用することによって、 一定期間内の表と索引に関するデータが提供され、 それによって時間の経過に伴うパフォーマンスの傾向をデータ・モデルに識別させることができます。
理想的には、統計を実行した後でアプリケーション・プログラムを再バインドするようにします。 統計が新しくなることによって、照会最適化プログラムが、 異なるアクセス・プランを選択する可能性があるためです。
一度にすべての統計を収集する時間がない場合には、 定期的に RUNSTATS を実行して収集できる分の統計のみを更新することもできます。 表で行われた活動の結果として、 RUNSTATS を実行して選択的に部分更新を行ったある期間と次の期間の間に不整合が見つかった場合は、 警告メッセージ (SQL0437W、理由コード 6) が出されます。 たとえば、最初は RUNSTATS を使用して表分布統計を収集したとし、 次に、RUNSTATS を使用して索引統計を収集したとします。 その場合に、表で行われた活動の結果として不整合が検出されたとすると、 その表の分布統計は除去され、警告メッセージが出されます。 こういう状況が生じたときには、RUNSTATS を実行して表分布統計を収集することをお勧めします。
RUNSTATS を定期的に使用する場合には、 索引統計を表統計に同期化することができるように、 表統計と索引統計の両方を一度に収集することをお勧めします。 索引統計では、最後に実行された RUNSTATS で収集された表統計および列統計のほとんどを保持しています。 表統計を最後に収集した時点以降にその表が広範囲に変更された場合には、 その表の索引統計のみを収集すると、 それらの 2 つの統計のセットは同期しないことになってしまいます。
次の状況では、索引データにのみ基づく統計を収集したいと思われるでしょう。
RUNSTATS ユーティリティーを使うと、 各種レベルの統計を収集することができます。 表の場合は、基本レベルの統計を収集するか、 または表内の列値に関する分布統計を収集することもできます (分布統計の収集と使用を参照)。 索引の場合は、基本レベルの統計を収集するか、 または詳細な統計を収集することもできます。 これは、最適化プログラムが索引走査の入出力コストの見積もりを正確なものにするのに役立ちます。 (「詳細」 統計については、クラスター索引を参照してください。)
注: | LONG またはラージ・オブジェクト (LOB)、または構造型列の場合は、 統計は収集されません。 行タイプの場合、表レベルの統計 NPAGES、FPAGES、および OVERFLOW は、 副表に対して収集されません。 拡張索引、または宣言済み一時表の場合、統計は収集されません。 |
以下の表に、RUNSTATS ユーティリティーによって更新されるカタログ統計を示します。
表 44. 表統計 (SYSCAT.TABLES と SYSSTAT.TABLES)
統計 | 説明 | RUNSTATS オプション | |||
---|---|---|---|---|---|
表 | 索引 | ||||
FPAGES | 表が使用しているページの数 | ○ | ○ | ||
NPAGES | 行が含まれているページの数 | ○ | ○ | ||
OVERFLOW | オーバーフローしている行の数 | ○ | × | ||
CARD | 表内の行の数 (カーディナリティー) | ○ | ○ (注 2) | ||
|
表 45. 列統計 (SYSCAT.COLUMNS と SYSSTAT.COLUMNS)
統計 | 説明 | RUNSTATS オプション | |||
---|---|---|---|---|---|
表 | 索引 | ||||
COLCARD | 列カーディナリティー | ○ (注 1) | ○ (注 2) | ||
AVGCOLLEN | 列の平均長 | ○ | ○ (注 2) | ||
HIGH2KEY | 列内で 2 番目に高い値 | ○ | ○ (注 2) | ||
LOW2KEY | 列内で 2 番目に低い値 | ○ | ○ (注 2) | ||
NUMNULLS | 列内のヌルの数 | ○ | ○ (注 2) | ||
|
表 46. 索引統計 (SYSCAT.INDEXES と SYSSTAT.INDEXES)
統計 | 説明 | RUNSTATS オプション | |||
---|---|---|---|---|---|
表 | 索引 | ||||
NLEAF | 索引葉ページの数 | × | ○ (注 3) | ||
NLEVELS | 索引レベルの数 | × | ○ | ||
CLUSTERRATIO | 表データのクラスター化の程度 | × | ○ (注 2) | ||
CLUSTERFACTOR | クラスター化の詳細の程度 | × | 詳細説明 (注 1、2) | ||
DENSITY | 索引の対象となるページ範囲にあるページ数に対する SEQUENTIAL_PAGES の比率 (パーセント単位) (注 4) | × | ○ | ||
FIRSTKEYCARD | 索引の最初の列の個別値の数 | × | ○ (注 3) | ||
FIRST2KEYCARD | 索引の最初の 2 つの列の個別値の数 | × | ○ (注 3) | ||
FIRST3KEYCARD | 索引の最初の 3 つの列の個別値の数 | × | ○ (注 3) | ||
FIRST4KEYCARD | 索引の最初の 4 つの列の個別値の数 | × | ○ (注 3) | ||
FULLKEYCARD | 索引のすべての列の個別値の数 | × | ○ (注 3) | ||
PAGE_FETCH_PAIRS | 異なるバッファー・サイズでのページ取り出し見積もり | × | 詳細説明 (注 1、2) | ||
SEQUENTIAL_PAGES | 索引キーの順序で、間をあまり空けずにディスクに位置づけられた葉ページの数。 | × | ○ | ||
|
表 47. 列分布統計 (SYSCAT.COLDIST と SYSSTAT.COLDIST)
統計 | 説明 | RUNSTATS オプション | |||
---|---|---|---|---|---|
表 | 索引 | ||||
DISTCOUNT | TYPE が Q の場合は、COLVALUE 統計以下の個別値の数 | 分布 (注 2) | × | ||
TYPE | 行の統計が頻出値統計または変位値統計かの標識 | 分布 | × | ||
SEQNO | 表の行を固有に識別するのに役立つ順序番号の頻度のランク | 分布 | × | ||
COLVALUE | 頻出値統計または変位値統計を収集する際のデータ値 | 分布 | × | ||
VALCOUNT | 列内でデータ値が発生する頻度、または変位数の場合は、 データ値 (COLVALUE) 以下の数値 | 分布 | × | ||
|
列分布統計についての詳細は、分布統計の収集と使用を参照してください。
ユーザー定義関数の統計は、RUNSTATS ユーティリティーでは収集されません。 それらの関数の統計は、手動で更新しなければなりません。 ユーザー更新が可能なカタログ統計と ユーザー定義関数の統計の更新を参照してください。