自動統計収集

Db2® オプティマイザーは、カタログ統計を使用して、照会の最も効率的なアクセス・プランを判別します。 Db2 の自動表保守フィーチャーの一部である自動統計収集を使えば、統計の更新が必要かどうかをデータベース・マネージャーに判断させることができます。

自動統計収集を使用するのではなく、統計を手動で収集することもできます。 しかし、ワークロードに対してどの統計を収集するかを判別するのは難しい作業であり、それらの統計を最新の状態に保つには時間がかかります。 日付が古い、あるいは不完全な表または索引に関する統計を使用すると、オプティマイザーが最適ではないプランを選択するため、照会の実行がスローダウンする可能性があります。

自動統計収集は、次の 2 とおりの方法で実行できます。
  • ステートメントのコンパイル時の同期収集には、リアルタイム統計 (RTS) フィーチャーを使用できます。 auto_stmt_stats データベース構成パラメーターは、RTS 統計収集および RUNSTATS アクティビティー・ロギングに使用されます。
  • 非同期収集のためには、バックグラウンドでの RUNSTATS コマンドの実行を有効にすることができます。 auto_runstats データベース構成パラメーターは、自動バックグラウンド統計収集で使用します。
これらのパラメーターは、両方とも、データベースの作成時にデフォルトで有効にされています。 リアルタイム統計収集が無効な場合でも、バックグラウンド統計収集を有効にすることができますが、リアルタイム統計収集を実行するときは、必ずバックグラウンド統計収集が有効になります。

構成アドバイザーは、各種のデータベース構成パラメーターを適切に設定することなど、データベースの初期構成を決定するために役立ちます。

IBM® Data Studio バージョン 3.1 以降では、タスク・アシスタントを使用して 自動統計収集を構成できます。 タスク・アシスタントは、オプションの設定、タスク実行のために自動生成されたコマンドの確認、およびそれらのコマンドの実行のプロセスをガイドします。 詳しくは、 タスク・アシストを使用したデータベースの管理を参照してください。 IBM Data Studio バージョン 3.1 以降では、タスク・アシスタントを使用して自動統計収集を構成できます。 タスク・アシスタントは、オプションの設定、タスク実行のために自動生成されたコマンドの確認、およびそれらのコマンドの実行のプロセスをガイドします。 詳しくは、『タスク・アシストを使用したデータベースの管理』を参照してください。

非同期統計収集およびリアルタイム統計収集について

照会オプティマイザーは、照会のニーズや表の更新アクティビティーの量 (更新、挿入、または削除操作の数) に基づいて、同期統計または非同期統計をどのように収集するかを決定します。

特定のメタデータを使用して統計を作成できるようにするためにも、リアルタイム統計収集を有効にできます。 統計の作成 (ファブリケーション) とは、通常の RUNSTATS コマンド・アクティビティーの一部として統計を収集するのではなく、統計を派生させる (導き出す) こと、または作成することです。 例えば、表のページ数、ページ・サイズ、および平均の行幅が分かれば、表の行数を導き出すことができます。 場合によっては、統計は派生させられるものではなく、索引およびデータ・マネージャーによって保守され、カタログに格納できるものです。 例えば、索引マネージャーは索引ごとのリーフ・ページの数とレベルのカウントを保守します。

リアルタイム統計収集の方が非同期統計収集よりも、タイムリーで、より正確な統計を提供します。 正確な統計を収集できると、照会実行プランをより良いものにできますし、パフォーマンスを向上させることが可能です。 リアルタイム統計収集を有効にしたかどうかに関わらず、2 時間のインターバルで非同期統計収集が行われます。 アプリケーションによっては、正確な統計を出すために、このインターバルでは不十分な場合があります。 また、リアルタイム統計収集または同期統計収集は、以下の場合に非同期収集要求も開始します。
  • 表のサイズが大きいので、サンプリングのために同期統計収集を使用する。
  • 同期統計が作成された。
  • 収集時間を超過したため、同期統計収集に失敗した。
さらに、表のアクティビティー・レベルが、同期統計収集を必要とする高さではないが、非同期収集を必要とする高さではあるという場合もあります。

非同期要求は多くて 2 つを同時に処理できますが、それぞれが対象とする表が異なっていなければなりません。 一方の要求はリアルタイム統計収集によって開始され、もう一方の要求は非同期統計収集によって開始されたものでなければなりません。

自動統計収集によるパフォーマンスへの影響は、 以下のいくつかの方法によって最低限に抑えられています。
  • 非同期統計収集は、スロットル調整した RUNSTATS ユーティリティーを使用して実行されます。 スロットル調整により、現在のデータベース・アクティビティーに基づいて、RUNSTATS ユーティリティーの消費するリソース量が制御されます。 データベース・アクティビティーが増えた場合は、このユーティリティーの実行速度を落とすことにより、リソース要求を減らします。
  • 同期統計収集は、照会 1 つにつき 5 秒に制限されています。RTS 最適化ガイドラインによって制限時間が決定されます。 同期収集が時間制限を超えると、非同期収集要求がサブミットされます。
  • 同期統計収集では、統計はシステム・カタログ内に格納されません。 代わりに、統計は統計キャッシュに格納され、後ほど非同期操作によってシステム・カタログ内に格納されます。 この格納手順により、システム・カタログの更新時に発生するメモリー使用やロックの競合を回避できます。 統計キャッシュ内の統計は、後続の SQL コンパイル要求で使用できます。
  • 1 つの表で行われる同期統計収集の操作は、一度に 1 つだけです。 同期統計収集を必要とする他の要求は、可能な場合には統計作成を行い、ステートメント・コンパイルを続行します。 この動作は、パーティション・データベース環境でも強制されます。この環境では、異なるデータベース・パーティション上の操作が同期統計を必要とする場合があります。
  • 統計が欠落している表またはアクティビティーのレベルが高い表 (更新、挿入、および削除の操作の数で測る) だけを、統計収集の対象として考慮します。 表が統計収集の基準を満たしている場合であっても、照会を最適化するために必要でない限り、統計が同期的に収集されることはありません。 場合によっては、照会オプティマイザーは統計なしでアクセス・プランを選択することもできます。 非同期統計収集が必要かどうかを検査するため、4000 ページを超える表がサンプリングされ、表のアクティビティーが高いために統計が変化したかどうか判断します。 変化が確実な場合にだけ、このような大きな表の統計は収集されます。
  • オンライン保守時間枠での統計収集は、統計が非同期か同期かによって異なります。
    • 非同期統計収集の場合、RUNSTATS ユーティリティーは、保守ポリシーで指定されているオンライン保守期間内に実行されるように自動的にスケジュールが設定されます。 このポリシーでは、自動統計収集の有効範囲に含まれる表集合も指定されるので、不必要なリソース消費が最小化されます。
    • 同期統計収集および作成は、メンテナンス・ポリシーで指定されたオンライン保守時間枠を使用しません。同期要求は直ちに実行される必要があり、収集時間も限定されているからです。 その代わりに、同期統計収集および作成は、自動統計収集の有効範囲に含まれる表集合を指定するポリシーを利用します。
  • 自動統計収集の実行中も、影響を受ける表に対し、引き続き通常のデータベース・アクティビティー (更新、挿入、または削除の操作) が可能です。
  • 同期収集は、以下のオブジェクトに対して行われません。
    • リアルタイム統計は、統計ビューに関しては収集されません。
    • リアルタイム統計は、ニックネームに関しては収集されません。 同期統計収集の場合、システム・カタログ内でニックネーム統計をリフレッシュするには、SYSPROC.NNSTAT プロシージャーを呼び出します。 非同期統計収集の場合、 Db2 ソフトウェアは自動的に SYSPROC.NNSAT プロシージャーは、システム・カタログ内のニックネーム統計情報をリフレッシュします。
  • 宣言済みおよび作成済みのグローバル一時表では、リアルタイム同期統計のみを収集できます。

リアルタイム統計収集は統計収集のメモリー使用量を最小化するように設計されていますが、まずテスト環境で試用して、パフォーマンスに悪影響が出ないことを確認してください。 一部のオンライン・トランザクション処理 (OLTP) のシナリオ、特に照会を実行できる時間に制限がある場合に、パフォーマンスに悪影響が及ぶことがあります。

リアルタイム同期統計収集の実行対象となるのは、通常表、マテリアライズ照会表 (MQT)、およびグローバル一時表です。 グローバル一時表に関しては、非同期統計は収集されません。 グローバル一時表は、自動保守ポリシー機能を使用してリアルタイム統計から除外することはできません。

自動統計収集 (同期または非同期) は、以下のオブジェクトに対しては行われません。
  • VOLATILE というマークが付けられている表 (SYSCAT.TABLES カタログ・ビューに VOLATILE フィールドが設定されている表)
  • SYSSTAT カタログ・ビューに対して UPDATE ステートメントを発行することにより手動で統計を更新した表。 これには、表の式ベースの索引に使用される式ベースのキー列の統計を手動で更新することも含まれます (ただし、これらの統計は別個の統計ビューに表示されます)。

    表の統計を手動で変更すると、データベース・マネージャーは、変更したユーザーがその統計の保守を行うものと見なします。 統計を手動で更新した表の統計をデータベース・マネージャーに保守させるには、RUNSTATS コマンドを使用して統計を収集するか、LOAD コマンドの使用時に統計の収集を指定します。 バージョン 9.5 より前に作成した表で、アップグレード前に統計を手動で更新していた表は、この制限の影響を受けません。 それらの表の統計は、手動で更新するまでは、データベース・マネージャーによって自動的に保守されます。

統計作成は、以下のオブジェクトに対しては行われません。
  • 統計ビュー
  • SYSSTAT カタログ・ビューに対して UPDATE ステートメントを発行することによって手動で統計を更新した表。 リアルタイム統計収集が有効になっていない場合でも、手動で統計を更新した表に対していくつかの統計作成が行われます。

パーティション・データベース環境では、統計は単一のデータベース・パーティションで収集されてから、外挿されます。 データベース・マネージャーは、必ずデータベース・パーティション・グループの最初のデータベース・パーティションで統計 (RTS および自動バックグラウンド統計の両方) を収集します。

データベースがアクティブにされてから最低 5 分間は、リアルタイム統計収集は行われません。

リアルタイム統計プロセスは、静的および動的 SQL の両方で生じます。

TRUNCATE ステートメントまたは IMPORT コマンドを使用して切り捨てられた表は、古くなった統計を持っているものとして自動的に認識されます。

自動統計収集 (同期と非同期の両方) は、統計収集の対象の表を参照する、キャッシュに入れられた動的ステートメントを無効にします。 この無効化により、キャッシュに入れられた動的ステートメントを最新の統計で再度最適化できます。

データベースが非アクティブ化されると、非同期自動統計収集操作が中断する可能性があります。 ACTIVATE DATABASE コマンドまたは sqle_activate_db API を使用してデータベースを明示的にアクティブ化したのではない場合、最後のユーザーがデータベースから切断した時点でデータベースは非アクティブ化されます。 操作が中断された場合、Db2 診断ログ・ファイルにエラー・メッセージが記録されることがあります。 非同期自動統計収集操作が中断されないようにするには、データベースを明示的にアクティブ化してください。

式ベースの索引を持つ表の場合、表の統計収集の一部として、式ベースのキー列の統計が収集され、キャッシュに入れられます。 式ベースのキー列について、統計作成が行われることはありません。

リアルタイム統計および Explain プロセス

EXPLAIN 機能によってのみ説明される (実行されない) 照会のリアルタイム処理はありません。 以下の表では、CURRENT EXPLAIN MODE 特殊レジスターの種々の値の動作を要約しています。

表 1. CURRENT EXPLAIN MODE 特殊レジスターの値の関数としてのリアルタイム統計収集
CURRENT EXPLAIN MODE 特殊レジスター値 リアルタイム統計収集を考慮するかどうか
YES はい
EXPLAIN いいえ
NO はい
REOPT はい
RECOMMEND INDEXES いいえ
EVALUATE INDEXES いいえ

自動統計収集および統計キャッシュ

キャッシュに入れられた統計は、同期的に収集して、すべての照会で使用可能な統計にすることができます。 このキャッシュは、カタログ・キャッシュの一部です。 パーティション・データベース環境では、カタログ・キャッシュは各データベース・パーティションにありますが、統計キャッシュはカタログ・データベース・パーティションにのみあります。 リアルタイム統計収集を有効にした場合は、カタログ・キャッシュの必要性が高くなります。 リアルタイム統計収集を有効にする場合は、catalogcache_sz データベース構成パラメーターの値を調整することを検討してください。

自動統計収集および統計プロファイル

収集される統計のタイプをカスタマイズするには、特定の表に対して独自の統計プロファイルを作成することができます。 詳しくは、『統計プロファイルを使用した統計の収集』を参照してください。

RTS および自動バックグラウンド統計は、表に対して有効な統計プロファイルに従って収集されますが、以下の例外があります。
  • 同期統計収集のメモリー使用量を最小化するため、データベース・マネージャーはサンプリングを使用して統計を収集する場合があります。 その場合のサンプリング率とサンプリング方法は、統計プロファイルで指定されているサンプリング率とサンプリング方法とは異なる可能性があります。
  • RTS 収集では統計作成も可能ですが、統計プロファイルで指定されているすべての種類の統計を作成できるとは限りません。 例えば、COLCARD、HIGH2KEY、および LOW2KEY などの列統計は、列がいずれかの索引の主キー列になっていない場合には、作成できません。

統計プロファイルで指定されたすべての統計を RTS 統計収集で収集できなかった場合は、非同期収集要求がサブミットされます。

以降のセクションで、自動統計収集のさまざまな動作特性について説明します。