管理の手引き


RUNSTATS ユーティリティーを使用しての統計収集

RUNSTATS ユーティリティーは、照会最適化プロセス処理のために、 システム・カタログ表内の統計を更新します。 それらの統計がないと、データベース・マネージャーが、 SQL ステートメントのパフォーマンスを低下させるような決定を下す可能性があります。 RUNSTATS ユーティリティーを使うと、表、索引、 または表と索引の両方に入っているデータに関する統計を収集することができます。

表データと索引データの両方に基づく統計を収集して、 以下の状況においてアクセス・プラン選択プロセスに対し正確な情報を提供するには、 RUNSTATS ユーティリティーを使います。

区分データベースで処理を行う場合には、 単一ノードで RUNSTATS 操作を実行することによって、表とその索引に関連する統計を収集します。 (ユーティリティーを実行するノードは、 コマンドを出すノードに表データが含まれているか否かによって決まります。 詳細については、RUNSTATS を実行するデータベース区画を参照してください。) カタログに保管されている統計は表レベルの情報を表すので、 データベース・マネージャーによって収集されたノード・レベルの統計に、 必要に応じて、表の区分化先のノード数を乗算します。 これによって、 各ノードで RUNSTATS を実行してその結果を集計して得られる実際の統計の近似値を求めることができます。
注:DB2 照会最適化プログラムは、属性値 (データ) が、 システムのデータベース区画全体に等量かつ均等に入っていると想定しています。 データの配置が均等ではなかった場合には、 代表的な表分配がなされていると考えられるデータベース区画に対して、 このコマンドを実行する必要があります。

RUNSTATS を実行するデータベース区画

ある表上で RUNSTATS を起動する場合は、 表を保管するデータベースに接続する必要はありますが、 コマンドを出すデータベース区画には必ずしもその表の区画が含まれていなくてもかまいません。

統計の分析

統計を分析すると、再編成が必要であることがわかる場合があります。 それは、次のようなことに表れます。

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)
注:
  1. 区分データベースの場合は、各統計の値は、 そのデータベース区画でのカウント値にデータベース区画の数を乗じて推定値を得ます。
  2. 表に定義された索引がないときに、索引の統計を要求した場合には、 CARD 統計が新たに更新されることはありません。 前の CARD 統計は引き続き保持されます。

表 45. 列統計 (SYSCAT.COLUMNS と SYSSTAT.COLUMNS)
統計 説明 RUNSTATS オプション
索引
COLCARD 列カーディナリティー ○ (注 1) ○ (注 2)
AVGCOLLEN 列の平均長 ○ (注 2)
HIGH2KEY 列内で 2 番目に高い値 ○ (注 2)
LOW2KEY 列内で 2 番目に低い値 ○ (注 2)
NUMNULLS 列内のヌルの数 ○ (注 2)
注:
  1. COLCARD は、表内のすべての列に関して見積もられます。 区分データベースの場合、列がその表の単一列区分化キーであるときには、カウントの値は、 データベース区画でのカウントにデータベース区画の数を乗ずることによって見積もられます。
  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 索引キーの順序で、間をあまり空けずにディスクに位置づけられた葉ページの数。 ×
注:
  1. 詳細索引統計は、RUNSTATS コマンドに DETAILED 文節を指定するか、 または RUNSTATS API を呼び出すときに statsopt パラメーターに AY、または X を指定することによって収集します。
  2. 表のサイズが相当大きいものでない限り、 DETAILED 文節を指定しても CLUSTER_FACTOR および PAGE_FETCH_PAIRS は収集されません。 表のページ数が約 25 より大きいと、 CLUSTERFACTOR または PAGE_FETCH_PAIRS 統計が収集されます。 この場合、CLUSTERRATIO は -1 です (収集されません)。 表が比較的小さいと、RUNSTATS は CLUSTERRATIO だけを記入し、 CLUSTERFACTOR および PAGE_FETCH_PAIRS は記入しません。 DETAILED 文節を指定しないと、CLUSTERRATIO 統計だけが収集されます。
  3. 区分データベースの場合は、この値は、 そのデータベース区画でのカウント値にデータベース区画の数を掛け合わせたものから見積もられます。
  4. この統計は、その表に属する索引を含むページがファイルに対してどのくらいの比率 (パーセント単位) を占めるかを測定します。 表に定義された索引が 1 つしかない表の場合には、通常、DENSITY は 100 になります。 DENSITY は、索引ページが事前取り出しされたときに、 他の索引から不適切なページが平均してどのくらい読み取られたのかについて、 最適化プログラムが見積もるのに使用されます。

表 47. 列分布統計 (SYSCAT.COLDIST と SYSSTAT.COLDIST)
統計 説明 RUNSTATS オプション
索引
DISTCOUNT TYPE が Q の場合は、COLVALUE 統計以下の個別値の数 分布 (注 2) ×
TYPE 行の統計が頻出値統計または変位値統計かの標識 分布 ×
SEQNO 表の行を固有に識別するのに役立つ順序番号の頻度のランク 分布 ×
COLVALUE 頻出値統計または変位値統計を収集する際のデータ値 分布 ×
VALCOUNT 列内でデータ値が発生する頻度、または変位数の場合は、 データ値 (COLVALUE) 以下の数値 分布 ×
注:
  1. 列分布統計は、RUNSTATS コマンドに WITH DISTRIBUTION 文節を指定するか、 または RUNSTATS API を呼び出すときに、 statsopt パラメーターに AD、 あるいは Y を指定することによって収集します。 列の値が十分に不均一でないかぎり、分布統計は収集されません
  2. DISTCOUNT は、索引の最初のキー列である列でのみ収集されます。
  3. 区分データベースの場合は、VALCOUNT の値は、 そのデータベース区画でのカウントにデータベース区画の数を掛け合わせて見積もられます。 例外として、TYPE が 'F' で、さらにその列が表の単一列区分化キーである場合には、 VALCOUNT は単純にデータベース区画のカウントになります。

列分布統計についての詳細は、分布統計の収集と使用を参照してください。

ユーザー定義関数の統計は、RUNSTATS ユーティリティーでは収集されません。 それらの関数の統計は、手動で更新しなければなりません。 ユーザー更新が可能なカタログ統計ユーザー定義関数の統計の更新を参照してください。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]