Oracle Database 12c の新機能「適応計画と自動再最適化」

今号では、 Oracle Database 12c の新機能である適応計画と自動再最適化をご紹介します。ぜひご一読ください。

統計情報と実行計画

Oracle Database では、SQL の実行計画を決定する際、事前に採取した統計情報を参照して処理の対象となる表のデータ傾向を把握します。この傾向に基づいて最も処理コストが低くなると予測されるアクセスパス、結合順序、結合方式などを決定します。

しかしながら、統計情報はリアルタイムで更新されるものではなく、頻繁に大量の更新が行われる表では統計情報と実際の表のデータ傾向に大きな乖離が生じる場合があります。
このような状況では、Oracle Database が処理対象となる表の状況を「勘違い」してSQL のコスト計算を行うため、Oracle Database が見積もった予測よりも遥かに大きな処理コストが必要な実行計画を採用し、大きなパフォーマンス劣化を引き起こす恐れがあります。

※弊社サポートでは実際のデータ状況と乖離した統計情報によるパフォーマンスの劣化について、一定数のお問い合わせをお客様から頂いています。

Oracle Database 12c では、オプティマイザが SQL 実行時に実行計画の調整を行い、より的確な統計情報を使用・検出するための一連の機能として、適応問い合わせ最適化(Adaptive Query Optimization) が追加されています。
適応計画と自動再最適化は、前述の適応問い合わせ最適化に含まれる機能で、既存の統計情報の非リアルタイム性に対して、Oracle Database 内部から対応することを目的としています。

適応計画について

適応計画とは、問合わせ実行時に収集した統計に基き、最終的な実行計画をより適切なものに切り替えることのできる機能です。具体的には、以下のようなシーケンスで必要に応じた実行計画の切り替えを行っています。

  1. リクエストされた SQL 文を解析
  2. 既存の統計情報を使用して、基礎となる実行計画(デフォルトプラン)を作成
  3. 対象表の統計情報の一部(行数等)を取得
  4. 取得された情報が既存の統計情報と異なっている場合、オプティマイザが定めた閾値を超えた場合には実行計画を切り替える

この仕組みにより、統計情報と実際のデータ状況に乖離が発生し、デフォルトプランが不適切なものになっていると判断できる場合には、より適切な実行計画で SQL を実行することが可能となります。

ただし、適応計画による実行計画の切り替えは、デフォルトプランの各ステップの内容を機械的に変更するもので、コストの再評価などは行わないため、ステップの実行順序やステップ間の構造を変更することはできません。このため、変更可能な範囲は結合方法とパラレルの分散方法に限定されます。

例 : PX SEND RANDOM を PX SEND HASH に変更
      NESTED LOOPS JOIN を HASH JOIN に変更

適応計画機能の有効・無効は初期化パラメータ "OPTIMIZER_ADAPTIVE_REPORTING_ONLY"で制御されます。デフォルトは有効 (FALSE) で、ALTER SYSTEM によるデータベース全体での有効化・無効化に加え、ALTER SESSION によるセッション単位での制御も可能です。
なお、本パラメータを "TRUE" に設定した場合、適応計画機能は無効となり、実行計画の動的な切り替えは行われませんが、適応計画に必要な統計の収集は継続して行われます。

自動再最適化について

自動再最適化とは、適応計画と対になる機能で、SQL の実行時に収集された統計情報が既存のものとは大きく異なる場合、次に同じ SQL が実行された際には以前のものではなく、新しく収集された統計情報を使用して実行計画を作成する機能です。
具体的には、以下のようなシーケンスで採用する統計情報を変更しています。

  1. リクエストされた SQL 文を実行
  2. 実行時に収集した統計情報が予測と大きく異なる場合、カーソルにその情報を記録
  3. (1) で実行された SQL 文を再度リクエスト
  4. (2) で収集した統計情報に基づいて実行計画を作成し、SQL 文を実行

実行計画の評価段階で新しい統計情報を使用できるため、適応計画では対応できなかった結合順序の変更や実行計画全体の構造の最適化にも対応できることが特徴です。

前述の通り、自動再最適化は適応計画と対になる機能のため、適応計画機能から独立して使用することはできません。このため、機能の有効・無効は、前述の適応計画機能と同様に初期化パラメータ "OPTIMIZER_ADAPTIVE_REPORTING_ONLY" で制御されます。
本パラメータを "TRUE" に設定した場合、機能自体は無効となりますが、本機能に必要な統計の収集は継続して行われる点も適応計画の場合と同様です。

なお、本機能は適応計画と異なり、2 回以上の繰り返し実行で効果を発揮する機能であることも含め、以下のような点にご留意ください。

  • 必要な情報をカーソルに保持するため、頻繁にカーソルがエイジアウトする環境や、共有プールのキャッシュヒット率が低い環境では効果を期待しづらい
  • SQL 実行時のデータ傾向が都度異なるような状況では、直前の結果に基づいた実行計画が当初のものより不適切なものとなるリスクがある
  • 適応計画と自動再最適化のどちらか一方のみを有効にすることはできない

まとめ

適応計画と自動再最適化は統計情報の非リアルタイム性を補うことのできる機能で、統計情報と実際のデータ傾向の乖離によるパフォーマンスへの影響をある程度抑えることができるのがメリットです。一方、実行計画を自動的に変更するという性質上、使用にあたっては性能面での影響を十分に考慮する必要があります。

最適な実行計画を評価するにあたり、既存の統計では不十分であるような場合に効果を発揮する機能といえます。機能やお使いのシステムの特性を踏まえたうえで使用をご検討ください。

(オラクル事業部 技術担当サポートセンターG 平林)

Oracle Database 12c の新機能「適応計画と自動再最適化」