未承認の実行計画を自動展開タスクで承認する手順です。
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
再度、インデックス作成列を条件に利用した検索を実行します。
今度はインデックススキャンとなったことがわかります。
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
再度、インデックス作成列を条件に利用した検索を実行します。
今度はインデックススキャンとなったことがわかります。