未承認の実行計画を自動展開タスクで承認する手順です。

SET SERVEROUTPUT ON
DECLARE
  l_return VARCHAR2(32767);
BEGIN
  l_return := DBMS_SPM.create_evolve_task(sql_handle => 'SQL_7b76323ad90440b9');
  DBMS_OUTPUT.put_line('Task Name; ' || l_return);
END;
/

Task Name; タスク_443

PL/SQLプロシージャが正常に完了しました。


SQL HANDLEを指定した評価タスクを作成します。
タスクID「タスク_443」が次に必要になってきます。

SET SERVEROUTPUT ON
DECLARE
  l_return VARCHAR2(32767);
BEGIN
  l_return := DBMS_SPM.execute_evolve_task(task_name => 'タスク_443');
  DBMS_OUTPUT.put_line('Execution Name; ' || l_return);
END;
/

Execution Name; EXEC_467

PL/SQLプロシージャが正常に完了しました。


タスクIDを指定して作成したタスクを実行します。
今度は実行ID「EXEC_467」が必要になります。

SET LONG 1000000 PAGESIZE 1000 LONGCHUNKSIZE 100 LINESIZE 100

SELECT DBMS_SPM.report_evolve_task(task_name => 'タスク_443', execution_name => 'EXEC_467') AS output
FROM   dual;

OUTPUT
----------------------------------------------------------------------------------------------------
GENERAL INFORMATION SECTION
------------------------------------------------------------------------
---------------------

 Task Information:
 ---------------------------------------------
 Task Name            : タスク_443
 Task Owner           : SYS
 Execution Name       : EXEC_467
 Execution Type       : SPM EVOLVE
 Scope                : COMPREHENSIVE
 Status               : COMPLETED
 Started              : 10/23/2016 16:28:21
 Finished             : 10/23/2016 16:28:21
 Last Updated         : 10/23/2016 16:28:21
 Global Time Limit    : 2147483646
 Per-Plan Time Limit  : UNUSED
 Number of Errors     : 0
------------------------------------------------------------------
---------------------------

SUMMARY SECTION
-------------------------------------------------------
--------------------------------------
  Number of plans processed  : 1
  Number of findings         : 1
  Number of recommendations  : 1
  Number of errors           : 0
-----------------------------------------------------------------------
----------------------

DETAILS SECTION
------------------------------------------------------------
---------------------------------
 Object ID          : 2

 Test Plan Name     : SQL_PLAN_7qxjk7bch8h5t17ba446f

 Base Plan Name     : SQL_PLAN_7qxjk7bch8h5tb65c37c8

 SQL Handle         : SQL_7b76323ad90440b9

 Parsing Schema     : TEST

 Test Plan Creator  : TEST

 SQL Text           : SELECT description FROM spm_test_
tab WHERE id = 99

Execution Statistics:
-----------------------------
                    Base Plan                     Test Plan

                    ----------------------------  ----------------
------------
 Elapsed Time (s):  .000018                       .000003

 CPU Time (s):      .000011                       0

 Buffer Gets:       4                             0

 Optimizer Cost:    14                            2

 Disk Reads:        0                             0

 Direct Writes:     0                             0

 Rows Processed:    0                             0

 Executions:        10                            1
0


FINDINGS SECTION
----------------------------------------------------
-----------------------------------------

Findings (1):
-----------------------------
 1. 計画は0.02000秒で検証されました。検証されたパフォーマンスが、ベースライン計画のパフォーマンスを1
5.00370倍上回ったため、利点基準に達しま
    した。


Recommendation:
-----------------------------
 Consider accepting the plan. Execute

 dbms_spm.accept_sql_plan_baseline(task_name => 'タスク_443', object_id => 2
,
 task_owner => 'SYS');



EXPLAIN PLANS SECTION
--------------------------------------------------------------
-------------------------------

Baseline Plan
-----------------------------
 Plan Id          : 365
 Plan Hash Value  : 3059496904

----------------------------------------------------------
-------------------
| Id  | Operation           | Name         | Rows | Byt
es | Cost | Time     |
----------------------------------------------------
-------------------------
|   0 | SELECT STATEMENT    |              |    1 |    25 |   14 | 00:00:0
1 |
| * 1 |   TABLE ACCESS FULL | SPM_TEST_TAB |    1 |    25 |   14 | 00:0
0:01 |
--------------------------------------------------------------------
---------

Predicate Information (identified by operation id):
------------------------------------------
* 1 - filter("ID"=99)


Test Plan
-----------------------------
 Plan Id          : 366
 Plan Hash Value  : 398083183

-------------------------------------------------------------------
----------------------------
| Id  | Operation                             | Name         | Rows | B
ytes | Cost | Time     |
--------------------------------------------------
---------------------------------------------
|   0 | SELECT STATEMENT                      |
       |    1 |    25 |    2 | 00:00:01 |
|   1 |   TABLE ACCESS BY INDEX ROWID BATCHED | SPM_TEST_T
AB |    1 |    25 |    2 | 00:00:01 |
| * 2 |    INDEX RANGE SCAN                   | SPM_TEST_IDX |
    1 |       |    1 | 00:00:01 |
------------------------------------------------------------------
-----------------------------

Predicate Information (identified by operation id):
------------------------------------------
* 2 - access("ID"=99)

---------------------------------------------------
------------------------------------------


評価タスクの実行結果を確認します。
インデックススキャンとテーブルスキャンのコストが比較され、インデックススキャンの方がコストが低いと判断されました。

SET SERVEROUTPUT ON
DECLARE
  l_return NUMBER;
BEGIN
  l_return := DBMS_SPM.implement_evolve_task(task_name => 'タスク_443');
  DBMS_OUTPUT.put_line('Plans Accepted: ' || l_return);
END;
/

Plans Accepted: 1

PL/SQLプロシージャが正常に完了しました。


評価タスクで生成された推奨事項を受け入れます。
これでインデックススキャンの実行計画が承認されました。

SQL> SELECT sql_handle, plan_name, enabled, accepted
  2  FROM dba_sql_plan_baselines
  3  WHERE sql_handle = 'SQL_7b76323ad90440b9';

SQL_HANDLE           PLAN_NAME                      ENA ACC
-------------------- ------------------------------ --- ---
SQL_7b76323ad90440b9 SQL_PLAN_7qxjk7bch8h5t17ba446f YES YES
SQL_7b76323ad90440b9 SQL_PLAN_7qxjk7bch8h5tb65c37c8 YES YES

ACCEPTED=NO→YESに変化したことがわかります。

SET AUTOTRACE TRACE LINESIZE 130
SELECT description
FROM   spm_test_tab
WHERE  id = 99;

実行計画
----------------------------------------------------------
Plan hash value: 2290222957

----------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |              |     1 |    25 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| SPM_TEST_TAB |     1 |    25 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | SPM_TEST_IDX |     1 |       |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("ID"=99)

Note
-----
   - SQL plan baseline "SQL_PLAN_7qxjk7bch8h5t17ba446f" used for this statement


統計
----------------------------------------------------------
         13  recursive calls
         13  db block gets
         14  consistent gets
          0  physical reads
       3416  redo size
        591  bytes sent via SQL*Net to client
        551  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


再度、インデックス作成列を条件に利用した検索を実行します。
今度はインデックススキャンとなったことがわかります。