【优化】SPM(上)自动捕获sql执行计划并演进

Spm的作用及应用场合:
1 Spm的主要作用:通过管理sql执行计划, 提高和稳定系统性能。
2应用场合数据库升级;不间断的系统数据改变;业务系统新模块的开发。

自动捕获sql执行计划演进

1)查询baseline信息:

SYS@ORA11GR2>select sql_handle,sql_text,plan_name,origin,version,created,last_modified,last_executed,last_verified,enabled,accepted,fixed from dba_sql_plan_baselines ;

 

no rows selected

 

2)查询参数optimizer_capture_sql_plan_baselines显示是否开启自动捕获sql_plan

修改参数开启自动捕获执行计划(自动捕获特指重复执行的sql语句,单次执行捕获不了)

SYS@ORA11GR2>show parameter optimizer_capture_sql_plan_baselines

 

NAME                                 TYPE        VALUE

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

optimizer_capture_sql_plan_baselines boolean     FALSE

更改参数:

SYS@ORA11GR2>alter system set optimizer_capture_sql_plan_baselines=true;

 

System altered.

 

SYS@ORA11GR2>show parameter optimizer_capture_sql_plan_baselines

 

NAME                                 TYPE        VALUE

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

optimizer_capture_sql_plan_baselines Boolean          TRUE

 

3)创建表:

HR@ORA11GR2>create table employees_bak as select distinct last_name from employees;

 

Table created.

 

HR@ORA11GR2>

 

查询sql模拟业务(一)

1.  第一次执行

HR@ORA11GR2>select * from employees_bak where last_name='Vargas';

 

LAST_NAME

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

Vargas

 

2.查询shared pool中的关于这条sql的信息:(以sys用户执行)

SYS@ORA11GR2>select sql_id,sql_text from v$sql where sql_text like 'select * from employees_bak where last_name=%';

 

SQL_ID        SQL_TEXT

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

99yvub515tr63 select * from employees_bak where last_name='Varga s'

 

3. 查询baseline信息         

SYS@ORA11GR2>select sql_handle,sql_text,plan_name,origin,version,created,last_modified,last_executed,last_verified,enabled,accepted,fixed from dba_sql_plan_baselines where sql_text like 'select * from employees_bak where last_name=%';

 

no rows selected

 

查询sql模拟业务(二)

1.第二次执行:

SYS@ORA11GR2>conn hr/hr

Connected.

HR@ORA11GR2>select * from employees_bak where last_name='Vargas';

 

LAST_NAME

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

Vargas

 

HR@ORA11GR2>conn / as sysdba

Connected.

 

2.查询shared pool中的关于这条sql的信息:(以sys用户执行)

SYS@ORA11GR2>select sql_id,sql_text from v$sql where sql_text like 'select * from employees_bak where last_name=%';

 

SQL_ID        SQL_TEXT

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

99yvub515tr63 select * from employees_bak where last_name='Vargas'

99yvub515tr63 select * from employees_bak where last_name='Vargas'

同样的sql,其sql_sid相同;

 

3.查询baseline中的信息

SYS@ORA11GR2>col sql_handle for a20

SYS@ORA11GR2>col sql_text for a15

SYS@ORA11GR2>col plan_name for a15

SYS@ORA11GR2>col created for a10

SYS@ORA11GR2>col last_modified for a10

SYS@ORA11GR2>col last_executed for a10

SYS@ORA11GR2>col last_verified for a10

SYS@ORA11GR2>col version for a10

SYS@ORA11GR2>set pagesize 1000

SYS@ORA11GR2>select sql_handle,sql_text,plan_name,origin,version,created,last_modified,last_executed,last_verified,enabled,accepted,fixed from dba_sql_plan_baselines where sql_text like 'select * from employees_bak where last_name=%';

 

SQL_HANDLE           SQL_TEXT                                              PLAN_NAME       ORIGIN         VERSION    CREATED    LAST_MODIF LAST_EXECU LAST_VERIF ENA ACC FIX

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

SQL_1c32abf260291c48 select * from employees_bak where last_name='Vargas'  SQL_PLAN_1scpby AUTO-CAPTURE   11.2.0.4.0 13-OCT-16  13-OCT-16  13-OCT-16          YES YES NO

                                                                           9h2k728c6c83284                           04.26.02.0 04.26.02.0 04.26.02.0

                                                                                                                     00000 PM   00000 PM   00000 PM

4.验证查看到的baseline里执行计划

HR@ORA11GR2>set autot trace

SP2-0618: Cannot find the Session Identifier.  Check PLUSTRACE role is enabled

SP2-0611: Error enabling STATISTICS report

HR@ORA11GR2>conn / as sysdba

Connected.

SYS@ORA11GR2>grant PLUSTRACE to hr;

grant PLUSTRACE to hr

      *

ERROR at line 1:

ORA-01919: role 'PLUSTRACE' does not exist

解决:

SYS@ORA11GR2>@$ORACLE_HOME/sqlplus/admin/plustrce.sql

SYS@ORA11GR2>

SYS@ORA11GR2>drop role plustrace;

drop role plustrace

          *

ERROR at line 1:

ORA-01919: role 'PLUSTRACE' does not exist

 

SYS@ORA11GR2>create role plustrace;

 

Role created.

 

SYS@ORA11GR2>grant select on v_$sesstat to plustrace;

 

Grant succeeded.

 

SYS@ORA11GR2>grant select on v_$statname to plustrace;

 

Grant succeeded.

 

SYS@ORA11GR2>grant select on v_$mystat to plustrace;

 

Grant succeeded.

 

SYS@ORA11GR2>grant plustrace to dba with admin option;

 

Grant succeeded.

 

SYS@ORA11GR2>set echo off

再授权给hr用户:

SYS@ORA11GR2>grant plustrace to hr;

 

Grant succeeded.

 

SYS@ORA11GR2>conn hr/hr

Connected.

HR@ORA11GR2>set autot trace

HR@ORA11GR2>select * from employees_bak where last_name='Vargas';

 

Execution Plan

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

Plan hash value: 3604099949

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

| Id  | Operation         | Name          | Rows  | Bytes | Cost (%CPU)| Time

  |

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

 

|   0 | SELECT STATEMENT  |               |     1 |    14 |     3   (0)| 00:00:0

1 |

 

|*  1 |  TABLE ACCESS FULL| EMPLOYEES_BAK |     1 |    14 |     3   (0)| 00:00:0

1 |

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

Predicate Information (identified by operation id):

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

   1 - filter("LAST_NAME"='Vargas')

Note

-----

   - dynamic sampling used for this statement (level=2)

   - SQL plan baseline "SQL_PLAN_1scpby9h2k728c6c83284" used for this statement

Statistics

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

         39  recursive calls

          0  db block gets

         32  consistent gets

          0  physical reads

          0  redo size

        531  bytes sent via SQL*Net to client

        523  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          2  sorts (memory)

          0  sorts (disk)

          1  rows processed

 

5.employees_bak进行优化,创建索引并重新执行sql

HR@ORA11GR2>set autot off;

HR@ORA11GR2>desc employees_bak

 Name                                      Null?    Type

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

 LAST_NAME                                 NOT NULL VARCHAR2(25)

 

HR@ORA11GR2>create index idx_employees_bak on employees_bak(last_name);

 

Index created.

 

HR@ORA11GR2>select * from employees_bak where last_name='Vargas';

 

LAST_NAME

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

Vargas

 

6.查询shared poolbaseline中信息

HR@ORA11GR2>conn / as sysdba

Connected.

——Shared pool中信息:

SYS@ORA11GR2>select sql_id,sql_text from v$sql where sql_text like 'select * from employees_bak where last_name=%';

 

SQL_ID         SQL_TEXT

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

99yvub515tr63  select * from employees_bak where last_name='Vargas'

——Baseline信息:

SYS@ORA11GR2>col sql_handle for a20

SYS@ORA11GR2>col sql_text for a15

SYS@ORA11GR2>col plan_name for a15

SYS@ORA11GR2>col created for a10

SYS@ORA11GR2>col last_modified for a10

SYS@ORA11GR2>col last_executed for a10

SYS@ORA11GR2>col last_verified for a10

SYS@ORA11GR2>col version for a10

SYS@ORA11GR2>set pagesize 1000

SYS@ORA11GR2>select sql_handle,sql_text,plan_name,origin,version,created,last_modified,last_executed,last_verified,enabled,accepted,fixed from dba_sql_plan_baselines where sql_text like 'select * from employees_bak where last_name=%';

 

SQL_HANDLE           SQL_TEXT        PLAN_NAME       ORIGIN         VERSION

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

CREATED    LAST_MODIF LAST_EXECU LAST_VERIF ENA ACC FIX

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

SQL_1c32abf260291c48 select * from e SQL_PLAN_1scpby AUTO-CAPTURE   11.2.0.4.0

                     mployees_bak wh 9h2k728c6c83284

                     ere last_name='

                     Vargas'

13-OCT-16  13-OCT-16  13-OCT-16             YES YES NO

04.26.02.0 04.26.02.0 04.26.02.0

00000 PM   00000 PM   00000 PM

 

SQL_1c32abf260291c48 select * from e SQL_PLAN_1scpby AUTO-CAPTURE   11.2.0.4.0

                     mployees_bak wh 9h2k728d8e34edf

                     ere last_name='

                     Vargas'

13-OCT-16  13-OCT-16                        YES NO  NO

06.53.12.0 06.53.12.0

00000 PM   00000 PM

查看新的执行计划SQL_PLAN_1scpby9h2k728d8e34edf并没有被演进,即还没有被放到baseline里供以后复用。

 

7.演进新的执行计划

SYS@ORA11GR2>set serveroutput on

SYS@ORA11GR2>set long 10000

SYS@ORA11GR2>declare

  2      report clob;

  3  begin

  4      report := dbms_spm.evolve_sql_plan_baseline(

  5                    sql_handle => 'SQL_1c32abf260291c48');

  6      dbms_output.put_line(report);

  7  end;

  8  /

 

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

 

                        Evolve SQL Plan Baseline

Report

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

 

Inputs:

  SQL_HANDLE = SQL_1c32abf260291c48

  PLAN_NAME  =

TIME_LIMIT = DBMS_SPM.AUTO_LIMIT

  VERIFY     = YES

  COMMIT     = YES

Plan:

SQL_PLAN_1scpby9h2k728d8e34edf

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

  Plan was

verified: Time used .02 seconds.

  Plan passed performance criterion: 3 times

better than baseline plan.

  Plan was changed to an accepted plan.

 

Baseline Plan      Test Plan       Stats Ratio

 

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

  Execution Status:

COMPLETE       COMPLETE

  Rows Processed:                       1

1

  Elapsed Time(ms):                  .022           .013              1.69

 

CPU Time(ms):                         0              0

  Buffer Gets:

3              1                 3

  Physical Read Requests:               0

0

  Physical Write Requests:              0              0

  Physical Read

Bytes:                  0              0

  Physical Write Bytes:

0              0

  Executions:                           1

1

 

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

                                 Report

Summary

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

Number of plans verified: 1

Number of plans accepted: 1

 

PL/SQL procedure successfully completed.

 

8.再次查看baseline里的执行计划信息

SYS@ORA11GR2>select sql_handle,sql_text,plan_name,origin,version,created,last_modified,last_executed,last_verified,enabled,accepted,fixed from dba_sql_plan_baselines where sql_text like 'select * from employees_bak where last_name=%';

 

SQL_HANDLE           SQL_TEXT        PLAN_NAME       ORIGIN         VERSION

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

CREATED    LAST_MODIF LAST_EXECU LAST_VERIF ENA ACC FIX

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

SQL_1c32abf260291c48 select * from e SQL_PLAN_1scpby AUTO-CAPTURE   11.2.0.4.0

                     mployees_bak wh 9h2k728c6c83284

                     ere last_name='

                     Vargas'

13-OCT-16  13-OCT-16  13-OCT-16             YES YES NO

04.26.02.0 04.26.02.0 04.26.02.0

00000 PM   00000 PM   00000 PM

 

SQL_1c32abf260291c48 select * from e SQL_PLAN_1scpby AUTO-CAPTURE   11.2.0.4.0

                     mployees_bak wh 9h2k728d8e34edf

                     ere last_name='

                     Vargas'

13-OCT-16  13-OCT-16             13-OCT-16  YES YES NO

06.53.12.0 07.05.24.0            07.05.24.0

00000 PM   00000 PM              00000 PM

查看执行计划SQL_PLAN_1scpby9h2k728d8e34edf已经被演进到baseline

 

9.再通过执行sql语句验证实际执行的执行计划是否是baseline里最优的执行计划:

SYS@ORA11GR2>conn hr/hr

Connected.

HR@ORA11GR2>set autot trace

HR@ORA11GR2>select * from employees_bak where last_name='Vargas';

 

Execution Plan

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

Plan hash value: 3689813232

 

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

| Id  | Operation        | Name              | Rows  | Bytes | Cost (%CPU)| Time

     |

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

 

|   0 | SELECT STATEMENT |                   |     1 |    14 |     1   (0)| 00:0

0:01 |

 

|*  1 |  INDEX RANGE SCAN| IDX_EMPLOYEES_BAK |     1 |    14 |     1   (0)| 00:0

0:01 |

 

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

 

Predicate Information (identified by operation id):

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

 

   1 - access("LAST_NAME"='Vargas')

 

Note

-----

   - dynamic sampling used for this statement (level=2)

   - SQL plan baseline "SQL_PLAN_1scpby9h2k728d8e34edf" used for this statement

 

Statistics

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

         29  recursive calls

         15  db block gets

         25  consistent gets

          0  physical reads

       2984  redo size

        531  bytes sent via SQL*Net to client

        523  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          1  rows processed

 

HR@ORA11GR2>set autot off;

验证sql语句执行计划已经走索引了,且对应了baseline里最优的执行计划SQL plan baseline "SQL_PLAN_1scpby9h2k728d8e34edf"

 


请使用浏览器的分享功能分享到微信等