oracle 11 gにおけるSQL最適化(SQL TUNINNG)新特性のSQL Plan Management(SPM)


1.概要
Oracle Database 11 gR 1には、DBAが任意のSQL文の実行計画を最適化するための新しいツールとして、SQL PlanManagement(SPM)が導入されています.これにより、オプティマイザ統計のリフレッシュ、アプリケーションの変更、データベース・バージョンのアップグレードによる影響が制限されます.この文書では、SPMの原理を基本的に理解し、パフォーマンスの最適化能力について簡単に説明します.
2.SPMの原理とメカニズム
Oracle 11 gは、SQL計画の予期せぬ悪化を解決するSQL Plan Management(SPM)と呼ばれる新しい特徴を、簡単で優雅な方法で実施しています.ユーザーセッションが自動SQL Plan Baselineキャプチャをオンにすると、CBOはSQL Management Base(SMB)にそのセッション内で実行されたSQLを記録し、SQL文テキスト、アウトライン(Outline)、バインド変数、およびそのコンパイル環境などをSQL Plan Baselineとして格納します.
文が初めて実行されるため、Oracle 11 gは当時の実行計画を最適化します.同じSQL文が2回目に実行されたときこそ、SPMの優雅さがより顕著に現れます.文の2回目の実行期間中、CBOは文の実行計画とSMBに格納された計画を比較し、新しい計画がSMBの計画よりも効率的であるかどうかを評価します.
新しい計画が文のパフォーマンスを向上させる場合、SPMは新しい計画を文の最良の計画としてマークします.DBAがOPTIMIZERを修正していない限りUSE_SQL_PLAN_BASELINESパラメータのデフォルト設定(true)では、CBOは現在の文実行に新しい計画を採用します.そうでなければ、新しい計画が文の性能を低下させると、CBOはSMBのすべての許容可能な計画から最もコストの低い計画を選択し、SPMはその新しい計画をSMBに格納します.近い将来、この新しい計画は良い選択になるかもしれません.
2.1.SQL Plan Baseblineの取得
Oracle 11 gでは、SQLPlan BaselineをキャプチャしてSMBに格納するのは簡単です.まず、OPTIMIZER_CAPTURE_SQL_PLAN_BASELINESパラメータは、SQL Plan Baselinesの自動キャプチャがオンになっているかどうかを制御します.このパラメータのデフォルトはFALSEに設定されています.これは、SQL Plan Baselinesのデフォルトが自動キャプチャされないことを意味します.しかし、DBAがセッションまたはシステムレベルでTRUEに設定されると、SPMはSQL文の実行を記録し始め、1つのSQL文が1回以上実行されると、SQL Plan Baselinesがキャプチャした候補とみなされる. 
次に、Oracle 11 gに新しいパッケージDBMS_があります.SPMは、以下のいくつかのソースから手動で「栽培」計画を行うことで、大量のSQL文を事前にキャプチャし、導入することができます.
ØデータベースLibrary CacheのSQL文の1つ以上を使用して、SQL PlanBaselinesを作成できます.プロセスLOAD_PLANS_FROM_CURSOR_CACHEは、潜在的なSMBの候補として、Library Cache内の任意の文のサブセットをキャプチャするために使用することができる. 
ØSQL Tuning SetまたはAWRスナップショットに格納されているSQL文は、プロセスLOAD_PLANS_FROM_SQLSETはSQL Plan Baselinesにキャプチャされ、変換されます.
Ø最後に、SQL Plan Baselinesはインポート・ストレージ・テーブルから使用できます.これは、異なるデータベースから文をキャプチャできることを意味します.
3.SQL Plan Baseline情報の表示
SMBにキャプチャおよび格納されたSQL Plan Baselineメタデータには、計画を制御するためのSPMおよびCBOの属性が含まれます.新しい計画がSMBに入ると、ENABLEDと表示されますが、ACCEPTEDは表示されません.
1)CBOはすでにこの計画を評価し、それが最良の計画であると判断した.
2)計画はACCEPTEDモードに進化した.CBOが計画を採用することを考慮する前に、計画はENABLEDとACCEPTEDとしてマークされなければならない.
これらのメタデータを表示する最も簡単な方法は、DBA_をクエリーすることです.SQL_PLAN_BASELINES辞書ビュー.以下は、実行計画を制御する最も価値のある情報のまとめです.
Table 1.1. SQL Plan Baseline Plan Control Metadata
Attribute
Description
SQL_HANDLE
A unique SQL identifier in string form; it can be used as a search key
PLAN_NAME
A unique SQL plan identifier in string form; it can be used as a search key
SQL_TEXT
The SQL statement’s unnormalized, actual text
ORIGIN
Tells if the SQL Plan was either:
  • AUTO-CAPTURE: Automatically captured
  • MANUAL-LOAD: Manually evolved
  • MANUAL-SQLTUNE: Automatically evolved by SQL Tuning Advisor
  • AUTO-SQLTUNE: Automatically evolved by Automatic SQL Tuning

  • ENABLED
    Indicates that the SQL Plan is enabled (YES) for CBO utilization or not (NO). Disabled plans are ignored by the CBO
    ACCEPTED
    Indicates that the SQL Plan is validated as a good plan, either because Oracle 11g has:
  • Automatically accepted it, or
  • The DBA has forced its manual acceptance by changing its status to ACCEPTED via procedure DBMS_SPM.ALTER_SQL_PLAN_BASELINE()

  • FIXED
    SQL Plans whose FIXED attribute is set to YES will be considered by the CBO. If multiple plans are marked as FIXED, the CBO will only select the best execution plan from those so marked
    OPTIMIZER_COST
    The total cost estimated by the CBO to execute the SQL statement using this execution plan
    既存のSQL Plan Baselinesで、1つのSQL文に潜在的な影響を与える別の方法はDBMS_XPLANの新プロセスDISPLAY_SQL_PLAN_BASELINE.たとえば、SMBとSQL文のハンドルが一致するすべてのSQLPlan Baselinesを表示するには、この手順を使用します.SQL文の計画名が指定されている場合は、その文の実行計画などを表示することもできます.
    4.自動キャプチャの実装とプロセス
    次に、SQL Plan Baselinesを自動的にキャプチャするプロセスを分析します.まず、OPTIMIZER_を設定しますCAPTURE_SQL_PLAN_BASELINESパラメータはTRUE(デフォルトはFALSE)であり、SQL Plan Baselines自動キャプチャをオンにします.OPTIMIZERをUSE_SQL_PLAN_BASELINESパラメータはTRUE(デフォルト)に設定されています.このパラメータは、CBOがSQL文の繰り返し実行によって生成された計画が良い計画として評価されるかどうかをチェックするかを制御します.
    次に、同じSQLを2回実行します.1回目の実行ではSQL文が記録され、2回目の実行ではSMBに自動的に取り込まれ、その文ACCEPTEDとしてマークされたSQLPlan Baselineが計画されます.
    その後、SQL文が再び実行され、異なる新しい計画が作成されると、計画は自動的にSMBにキャプチャされますが、ACCEPTEDとは表示されません.したがって、SPMは最初の計画をENABLEDとACCEPTEDとしてマークするだけです.
    5.SQL Plan Baselineの進化
    SPBにACCEPTEDと表示されていないSQL Plan Baselinesは、ACCEPTED状態を表示するようにさらに進化する必要があり、今後再実行されるSQL文に採用されることができ、SPBを進化させる方法は主に以下の2つがある.
    5.1.手作業の方法
    Ødbmsを呼び出す_spmパッケージのevolve_sql_plan_ベースライン関数
    SQL> var report clob;
    SQL> exec :report := dbms_spm.evolve_sql_plan_baseline();
    SQL> print :report
    SQL> select sql_text, plan_name, enabled, accepted fromdba_sql_plan_baselines;
    ØSQL Tuning Advisorキットの呼び出し
    SQL> var tname varchar2(30);
    SQL> exec :tname :=dbms_sqltune.create_tuning_task(sql_id => 'bfbr3zrg9d5cc');
    SQL> execdbms_sqltune.execute_tuning_task(task_name => :tname);
    SQL> selectdbms_sqltune.report_tuning_task(:tname, 'TEXT', 'BASIC') FROM dual;
    SQL> exec dbms_sqltune.accept_sql_profile(task_name=> :tname);
    SQL> select sql_text, plan_name, enabled,accepted from dba_sql_plan_baselines;
    5.2.自動メソッド
    Ø定期スケジューリングdbms_spmパッケージのevolve_sql_plan_baseline()
    ØSQL TUNING ADVISORを自動タスクウィンドウで自動運転させる
    6.具体的な操作命令
    Ø自動キャプチャとSPMの採用を開始する
    ALTER SESSION SET optimizer_capture_sql_plan_baselines=TRUE;
    ALTER SESSION SET optimizer_use_sql_plan_baselines=TRUE;
    ØSPMメタデータの表示
    COL creator         FORMAT A08      HEADING 'Creator'
    COL hndle           FORMAT A08      HEADING 'SQL|Handle'
    COL plnme           FORMAT A08      HEADING 'Plan|Name'
    COL sql_hdr         FORMAT A25      HEADING 'SQL Text' WRAP
    COL origin          FORMAT A12      HEADING 'Origin'
    COL optimizer_cost  FORMAT 9999999  HEADING 'CBO|Cost'
    COL enabled         FORMAT A04      HEADING 'Ena-|bled'
    COL accepted        FORMAT A04      HEADING 'Acpt'
    COL fixed           FORMAT A04      HEADING 'Fixd'
    COL autopurge       FORMAT A04      HEADING 'Auto|Purg'
    COL create_dt       FORMAT A11      HEADING 'Created|On' WRAP
    COL lst_exc_dt      FORMAT A11      HEADING 'Last|Executed' WRAP
    SELECT 
         creator
        ,SUBSTR(sql_handle, -8, 8) hndle
        ,SUBSTR(plan_name, -8, 8)  plnme
        ,SUBSTR(sql_text, 1, 75) sql_hdr
        ,origin
        ,optimizer_cost
        ,enabled
        ,accepted
        ,fixed
        ,autopurge
        ,TO_CHAR(created, 'yyyy-mm-dd hh24:mi:ss') create_dt
        ,TO_CHAR(last_executed, 'yyyy-mm-dd hh24:mi:ss') lst_exc_dt
      FROM dba_sql_plan_baselines
      WHERE (sql_text LIKE '%SPM%')
     ORDER BY 1,2,3;

    ØDBMS経由XPLAN.DISPLAY_SQL_PLAN_BASELINEには、特定のテキストが保持されているSQL Plan Baselinesが表示されます.
    SET LINESIZE 150
    SET PAGESIZE 2000
    SELECT PT.*
       FROM (SELECT 
                 DISTINCT sql_handle 
               FROM dba_sql_plan_baselines
              WHERE sql_text like '%SPM%') SPB,
            TABLE(DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE(SPB.sql_handle, NULL,'TYPICAL +NOTE')) PT;