tech_memo/ORACLE/SQL_PLAN
SPM (SQL Plan Management) †
概要 †
- SQLの実行計画を記録して、それを評価した後に、本番環境に適用することができる機能
- 実行計画がかわった時に、パフォーマンスがよくなるかを確認して、よくなるものだけを適用することができるという機能です。
- Insight Technology, Inc.
使い方 †
- 実行計画自動取得モードをオン
SQL> alter system set OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES=TRUE;
System altered.
SQL> show parameter OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES
NAME TYPE VALUE
------------------------------------ --------- --------
optimizer_capture_sql_plan_baselines boolean TRUE
- SQL Management Baseの確認方法
SQL> set autotrace off
SQL> SELECT sql_text,sql_handle
2 FROM dba_sql_plan_baselines
3 WHERE plan_name = 'SYS_SQL_PLAN_a52a4eafeb1890ae';
SQL_TEXT SQL_HANDLE
---------------------------------------- -------------------------
select * from test_spm where seq_no = 1 SYS_SQL_5c11383aa52a4eaf
- INDEX追加+統計情報再取得
SQL> create index idx_test_spm on test_spm(seq_no);
Index created.
SQL> BEGIN
2 DBMS_STATS.GATHER_INDEX_STATS(
3 ownname => 'TEST'
4 ,indname => 'IDX_TEST_SPM'
5 );
6 END;
7 /
PL/SQL procedure successfully completed.
- SPMを使っていると、統計情報を再取得しても、承認しないと、実行計画変わらない。
SQL> set autotrace off
SQL> select * from table(
2 dbms_xplan.display_sql_plan_baseline(
3 sql_handle=>'SYS_SQL_5c11383aa52a4eaf',
4 format=>'basic'));
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------
---------------------------------------------------------------------
SQL handle: SYS_SQL_5c11383aa52a4eaf
SQL text: select * from test_spm where seq_no = 1
---------------------------------------------------------------------
---------------------------------------------------------------------
Plan name: SYS_SQL_PLAN_a52a4eaf739aca96
Enabled: YES Fixed: NO Accepted: NO Origin: AUTO-CAPTURE
---------------------------------------------------------------------
Plan hash value: 2439131642
----------------------------------------------------
| Id | Operation | Name |
----------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST_SPM |
| 2 | INDEX RANGE SCAN | IDX_TEST_SPM |
----------------------------------------------------
---------------------------------------------------------------------
Plan name: SYS_SQL_PLAN_a52a4eafeb1890ae
Enabled: YES Fixed: NO Accepted: YES Origin: AUTO-CAPTURE
---------------------------------------------------------------------
Plan hash value: 1145642998
--------------------------------------
| Id | Operation | Name |
--------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS FULL| TEST_SPM |
--------------------------------------
34 rows selected.
- インデックススキャンのAcceptedがNOになっており、このインデックススキャンの実行計画がまだ未承認
- 実行計画の承認
SQL> DECLARE
2 report clob;
3 BEGIN
4 report := DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE(
5 sql_handle => 'SYS_SQL_5c11383aa52a4eaf');
6 DBMS_OUTPUT.PUT_LINE(report);
7 END;
8 /
----------------------------------------------------------------------
Evolve SQL Plan Baseline Report
----------------------------------------------------------------------
Inputs:
-------
SQL_HANDLE = SYS_SQL_5c11383aa52a4eaf
PLAN_NAME =
TIME_LIMIT = DBMS_SPM.AUTO_LIMIT
VERIFY = YES
COMMIT = YES
Plan: SYS_SQL_PLAN_a52a4eaf739aca96
-----------------------------------
Plan was verified: Time used .04 seconds.
Passed performance criterion: Compound improvement ratio >= 7.67.
Plan was changed to an accepted plan.
Baseline Plan Test Plan Improv. Ratio
------------- --------- -------------
Execution Status: COMPLETE COMPLETE
Rows Processed: 1 1
Elapsed Time(ms): 0 0
CPU Time(ms): 0 0
Buffer Gets: 23 3 7.67
Disk Reads: 0 0
Direct Writes: 0 0
Fetches: 0 0
Executions: 1 1
----------------------------------------------------------------------
Report Summary
----------------------------------------------------------------------
Number of SQL plan baselines verified: 1.
Number of SQL plan baselines evolved: 1.
PL/SQL procedure successfully completed.
- 以降、古い実行計画と、新しい実行計画のうち、コストが低いとオプティマイザに判断されたほうが利用される。
実行計画固定方法 †
参考 †
手順概要 †
手順詳細 †
- V$SESSIONなどから、対象SQLのSQL_IDを取得
- V$SQLから、上記SQL_IDをキーにして、「PLANL_HASH_VALUE」を取得
- 対象SQLの現状の実行計画をSPMへロードしベースライン作成
var res number
exec :res :=dbms_spm.load_plans_from_cursor_cache( sql_id => '問題SQL_ID', plan_hash_value => '問題PLAN_HASH_VALUE');
- ロードしたSQLのSQL_HANDLE、PLAN_NAMEをベースラインから取得
select sql_handle,plan_name, sql_text,origin, enabled, accepted, fixed,
to_char(created,'YY/MM/DD HH24:MI:SS') created,
to_char(last_modified,'YY/MM/DD HH24:MI:SS') modified,
to_char(last_executed,'YY/MM/DD HH24:MI:SS') executed,
to_char(last_verified,'YY/MM/DD HH24:MI:SS') verified,
optimizer_cost, executions, elapsed_time, cpu_time,
buffer_gets, disk_reads, rows_processed, fetches
from dba_sql_plan_baselines
order by created;
- ヒントなどで作成した理想の実行計画のSQL_IDとPLANL_HASH_VALUEを取得
- 上記理想の実行計画を、SPMへロードしベースライン作成
- 先述と同じ方法で、ロードしたSQLのSQL_HANDLE、PLAN_NAMEをベースラインから取得し、2種のベースラインが作成されたことを確認
- 遅いほうのベースライン(実行計画)を削除
var res number
exec :res :=DBMS_SPM.DROP_SQL_PLAN_BASELINE ('SQL_HANDLE','問題PLAN_NAME');
- 理想ペースラインを固定化(Fixed化)(※自動取得等による不要なベースラインORIGIN列「AUTO-CAPTURE」が増えることを抑止する)
var res number
execute :res := dbms_spm.alter_sql_plan_baseline(-
sql_handle =>'SQL_HANDLE',-
plan_name =>'固定するPLAN_NAME',-
attribute_name => 'FIXED',-
attribute_value => 'YES');
最新の20件
2023-01-26
2022-11-11
2022-03-02
2022-02-03
2021-11-18
2021-11-11
2021-10-27
2021-10-04
2021-09-30
2021-08-24
2021-04-01
2021-02-25
2020-08-13
2020-05-22
2020-04-16
2020-04-15
2020-03-23
2020-03-12
2020-02-27
今日の20件
- counter: 252
- today: 1
- yesterday: 0
- online: 2