暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 19C 管理演进的任务

原创 Asher.HU 2021-02-04
798


本主题描述了一个典型的用例,您可以在其中创建和执行任务,然后执行其建议。

下表描述了该CREATE_EVOLVE_TASK功能的一些参数

表28-10 DBMS_SPM.CREATE_EVOLVE_TASK参数

功能参数描述

sql_handle

语句的SQL处理。缺省值NULL考虑所有带有不可接受计划的SQL语句。

plan_name

计划标识符。默认NULL方式是考虑指定SQL句柄的所有不可接受的计划,或者如果SQL句柄为,则考虑所有SQL语句NULL

time_limit

时间限制(以分钟为单位)。第一个未接受计划的时间限制等于输入值。第二个未接受计划的时间限制等于输入值减去在第一个计划验证中花费的时间,依此类推。默认DBMS_SPM.AUTO_LIMIT方式是让系统根据需要执行的计划验证次数选择适当的时间限制。

task_name

用户指定的演化任务名称。

本节说明如何从命令行演变计划基准。在Cloud Control中,从SQL Plan Baseline子页面中选择一个计划,然后单击Evolve

本教程假定以下内容:

  • 您没有启用自动演进任务。
  • 您要为以下查询创建SQL计划基准:
    SELECT /* q1_group_by */ prod_name, sum(quantity_sold)
    FROM   products p, sales s
    WHERE  p.prod_id = s.prod_id
    AND    p.prod_category_id =203
    GROUP BY prod_name;
    
  • 您想要创建两个索引以提高查询性能,然后在使用性能优于计划基线中的计划的情况下,开发使用这些索引的计划。

要制定指定的计划:

  1. 执行以下初始设置:
    1. 使用管理员权限将SQL * Plus连接到数据库,然后通过刷新共享池和缓冲区高速缓存来准备本教程:
      ALTER SYSTEM FLUSH SHARED_POOL;
      ALTER SYSTEM FLUSH BUFFER_CACHE;
      
    2. 启用自动捕获SQL计划基准。

      例如,输入以下语句:

      ALTER SYSTEM SET OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES=true;
      
    3. 以用户身份连接到数据库sh,然后设置SQL * Plus显示参数:
      CONNECT sh
      -- enter password
      SET PAGES 10000 LINES 140
      SET SERVEROUTPUT ON
      COL SQL_TEXT FORMAT A20
      COL SQL_HANDLE FORMAT A20
      COL PLAN_NAME FORMAT A30
      COL ORIGIN FORMAT A12
      SET LONGC 60535
      SET LONG 60535
      SET ECHO ON
      
  2. 执行SELECT语句,以便SQL计划管理捕获它们:
    1. SELECT /* q1_group_by */第一次执行该语句。

      由于数据库仅捕获可重复语句的计划,因此该语句的计划基准为空。

    2. 查询数据字典以确认计划基线中不存在任何计划。

      例如,执行以下查询(包括示例输出):

      SELECT SQL_HANDLE, SQL_TEXT, PLAN_NAME, ORIGIN, ENABLED, 
             ACCEPTED, FIXED, AUTOPURGE
      FROM   DBA_SQL_PLAN_BASELINES
      WHERE  SQL_TEXT LIKE '%q1_group%';
      
      no rows selected
      

      SQL计划管理仅捕获可重复的语句,因此可以预期此结果。

    3. SELECT /* q1_group_by */第二次执行该语句。
  3. 查询数据字典以确保将计划加载到该语句的计划基线中。

    以下语句查询DBA_SQL_PLAN_BASELINES(包括示例输出):

    SELECT SQL_HANDLE, SQL_TEXT, PLAN_NAME,
           ORIGIN, ENABLED, ACCEPTED, FIXED 
    FROM   DBA_SQL_PLAN_BASELINES
    WHERE  SQL_TEXT LIKE '%q1_group%';
     
    SQL_HANDLE           SQL_TEXT         PLAN_NAME                      ORIGIN       ENA ACC FIX
    -------------------- ---------------- ------------------------------ ------------ --- --- ---
    SQL_07f16c76ff893342 SELECT /* q1_gro SQL_PLAN_0gwbcfvzskcu242949306 AUTO-CAPTURE YES YES NO
                         up_by */ prod_na
                         me, sum(quantity
                         _sold) FROM 
                         products p, 
                         sales s WHERE 
                         p.prod_id = 
                         s.prod_id AND
                         p.prod_category
                         _id =203 GROUP
                         BY prod_name
    

    输出显示该计划已被接受,这意味着该报表处于该报表的计划基线中。另外,原点是AUTO-CAPTURE,这表示该语句是自动捕获的,而不是手动加载的。

  4. 解释该语句的计划,并验证优化器正在使用该计划。

    例如,解释计划,如下所示,然后显示它:

    EXPLAIN PLAN FOR  
      SELECT /* q1_group_by */ prod_name, sum(quantity_sold)
      FROM   products p, sales s
      WHERE  p.prod_id = s.prod_id
      AND    p.prod_category_id =203
      GROUP BY prod_name;
    
    SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(null, null, 'basic +note'));
    

    输出示例如下:

    Plan hash value: 1117033222
     
    ------------------------------------------
    | Id  | Operation             | Name     |
    ------------------------------------------
    |   0 | SELECT STATEMENT      |          |
    |   1 |  HASH GROUP BY        |          |
    |   2 |   HASH JOIN           |          |
    |   3 |    TABLE ACCESS FULL  | PRODUCTS |
    |   4 |    PARTITION RANGE ALL|          |
    |   5 |     TABLE ACCESS FULL | SALES    |
    ------------------------------------------
     
    Note
    -----
       - SQL plan baseline "SQL_PLAN_0gwbcfvzskcu242949306" used for this statement
    

    该注释表示优化程序正在使用上一步中列出的计划名称显示的计划。

  5. 创建两个索引以提高SELECT /* q1_group_by */语句的性能

    例如,使用以下语句:

    CREATE INDEX ind_prod_cat_name 
      ON products(prod_category_id, prod_name, prod_id);
    CREATE INDEX ind_sales_prod_qty_sold 
      ON sales(prod_id, quantity_sold);
    
  6. select /* q1_group_by */再次执行该语句。

    因为启用了自动捕获,所以计划基线用该语句的新计划填充。

  7. 查询数据字典以确保将计划加载到该语句的SQL计划基线中。

    以下语句查询DBA_SQL_PLAN_BASELINES(包括示例输出)。

    SELECT SQL_HANDLE, SQL_TEXT, PLAN_NAME, ORIGIN, ENABLED, ACCEPTED
    FROM   DBA_SQL_PLAN_BASELINES
    WHERE  SQL_HANDLE IN ('SQL_07f16c76ff893342')
    ORDER BY SQL_HANDLE, ACCEPTED;
    
    SQL_HANDLE           SQL_TEXT             PLAN_NAME                      ORIGIN       ENA ACC
    -------------------- -------------------- ------------------------------ ------------ --- ---
    SQL_07f16c76ff893342 SELECT /* q1_group_b SQL_PLAN_0gwbcfvzskcu20135fd6c AUTO-CAPTURE YES NO
                         y */ prod_name, sum(
                         quantity_sold)
                         FROM   products p, s
                         ales s
                         WHERE  p.prod_id = s
                         .prod_id
                         AND    p.prod_catego
                         ry_id =203
                         GROUP BY prod_name
     
    SQL_07f16c76ff893342 SELECT /* q1_group_b SQL_PLAN_0gwbcfvzskcu242949306 AUTO-CAPTURE YES YES
                         y */ prod_name, sum(
                         quantity_sold)
                         FROM   products p, s
                         ales s
                         WHERE  p.prod_id = s
                         .prod_id
                         AND    p.prod_catego
                         ry_id =203
                         GROUP BY prod_name
    

    输出显示新计划不被接受,这意味着它在语句历史记录中,但不在SQL计划基线中。

  8. 解释该语句的计划,并验证优化器正在使用原始的未索引计划。

    例如,解释计划,如下所示,然后显示它:

    EXPLAIN PLAN FOR
      SELECT /* q1_group_by */ prod_name, sum(quantity_sold)
      FROM   products p, sales s
      WHERE  p.prod_id = s.prod_id
      AND    p.prod_category_id =203
      GROUP BY prod_name;
    SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(null, null, 'basic +note'));
    

    输出示例如下:

    Plan hash value: 1117033222
     
    ------------------------------------------
    | Id  | Operation             | Name     |
    ------------------------------------------
    |   0 | SELECT STATEMENT      |          |
    |   1 |  HASH GROUP BY        |          |
    |   2 |   HASH JOIN           |          |
    |   3 |    TABLE ACCESS FULL  | PRODUCTS |
    |   4 |    PARTITION RANGE ALL|          |
    |   5 |     TABLE ACCESS FULL | SALES    |
    ------------------------------------------
     
    Note
    -----
       - SQL plan baseline "SQL_PLAN_0gwbcfvzskcu242949306" used for this statement
    

    该注释表示优化器正在使用步骤3中列出的计划名称显示的计划。

  9. 以管理员身份连接,然后创建一个演化任务,该任务考虑所有带有不可接受计划的SQL语句。

    例如,执行DBMS_SPM.CREATE_EVOLVE_TASK函数,然后获取任务名称:

    CONNECT / AS SYSDBA
    VARIABLE cnt NUMBER
    VARIABLE tk_name VARCHAR2(50)
    VARIABLE exe_name VARCHAR2(50)
    VARIABLE evol_out CLOB
     
    EXECUTE :tk_name := DBMS_SPM.CREATE_EVOLVE_TASK( 
      sql_handle => 'SQL_07f16c76ff893342', 
      plan_name  => 'SQL_PLAN_0gwbcfvzskcu20135fd6c');
     
    SELECT :tk_name FROM DUAL;
    

    以下示例输出显示任务的名称:

    :EVOL_OUT
    --------------------------------------------------------------------------
    TASK_11
    

    现在已经创建了任务并具有唯一的名称,请执行任务。

  10. 执行任务。

    例如,执行DBMS_SPM.EXECUTE_EVOLVE_TASK功能(包括示例输出):

    EXECUTE :exe_name :=DBMS_SPM.EXECUTE_EVOLVE_TASK(task_name=>:tk_name); 
    SELECT :exe_name FROM DUAL;
    
    :EXE_NAME
    ---------------------------------------------------------------------------
    EXEC_1
    
  11. 查看报告。

    例如,执行DBMS_SPM.REPORT_EVOLVE_TASK功能(包括示例输出):

    EXECUTE :evol_out := DBMS_SPM.REPORT_EVOLVE_TASK( task_name=>:tk_name, execution_name=>:exe_name );
    SELECT :evol_out FROM DUAL;
    
    GENERAL INFORMATION SECTION
    --------------------------------------------------------------------------
     
     Task Information:
     ---------------------------------------------
     Task Name            : TASK_11
     Task Owner           : SYS
     Execution Name       : EXEC_1
     Execution Type       : SPM EVOLVE
     Scope                : COMPREHENSIVE
     Status               : COMPLETED
     Started              : 01/09/2012 12:21:27
     Finished             : 01/09/2012 12:21:29
     Last Updated         : 01/09/2012 12:21:29
     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_0gwbcfvzskcu20135fd6c
     Base Plan Name    : SQL_PLAN_0gwbcfvzskcu242949306
     SQL Handle        : SQL_07f16c76ff893342
     Parsing Schema    : SH
     Test Plan Creator : SH
     SQL Text          : SELECT /*q1_group_by*/ prod_name, 
                         sum(quantity_sold) 
                         FROM products p, sales s 
                         WHERE p.prod_id=s.prod_id AND p.prod_category_id=203 
                         GROUP BY prod_name
     
    Execution Statistics:
    -----------------------------
                        Base Plan                     Test Plan
                        ----------------------------  ------------------------
     Elapsed Time (s):  .044336                       .012649
     CPU Time (s):      .044003                       .012445
     Buffer Gets:       360                           99
     Optimizer Cost:    924                           891
     Disk Reads:        341                           82
     Direct Writes:     0                             0
     Rows Processed:    4                             2
     Executions:        5                             9
     
     
    FINDINGS SECTION
    ---------------------------------------------------------------------------
     
    Findings (1):
    -----------------------------
     1. The plan was verified in 2.18 seconds. It passed the benefit criterion
        because its verified performance was 2.01 times better than that of the
        baseline plan.
     
    Recommendation:
    -----------------------------
     Consider accepting the plan. Execute
     dbms_spm.accept_sql_plan_baseline(task_name => 'TASK_11', object_id => 2,
     task_owner => 'SYS');
     
    EXPLAIN PLANS SECTION
    ---------------------------------------------------------------------------
     
    Baseline Plan
    -----------------------------
     Plan Id          : 1
     Plan Hash Value  : 1117033222
     
    ---------------------------------------------------------------------------
    | Id| Operation               | Name     | Rows | Bytes   |Cost | Time    |
    ---------------------------------------------------------------------------
    | 0 | SELECT STATEMENT        |          |   21 |     861 | 924 | 00:00:12|
    | 1 |   HASH GROUP BY         |          |   21 |     861 | 924 | 00:00:12|
    | *2|    HASH JOIN            |          |267996|10987836 | 742 | 00:00:09|
    | *3|     TABLE ACCESS FULL   | PRODUCTS |   21 |     714 |   2 | 00:00:01|
    | 4 |     PARTITION RANGE ALL |          |918843| 6431901 | 662 | 00:00:08|
    | 5 |      TABLE ACCESS FULL  | SALES    |918843| 6431901 | 662 | 00:00:08|
    ---------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ------------------------------------------
    * 2 - access("P"."PROD_ID"="S"."PROD_ID")
    * 3 - filter("P"."PROD_CATEGORY_ID"=203)
      
    Test Plan
    -----------------------------
     Plan Id          : 2
     Plan Hash Value  : 20315500
     
    ---------------------------------------------------------------------------
    |Id| Operation            | Name             | Rows | Bytes  | Cost| Time |
    ---------------------------------------------------------------------------
    | 0|SELECT STATEMENT      |                  |    21|     861|891|00:00:11|
    | 1|  SORT GROUP BY NOSORT|                  |    21|     861|891|00:00:11|
    | 2|   NESTED LOOPS       |                  |267996|10987836|891|00:00:11|
    |*3|    INDEX RANGE SCAN  |IND_PROD_CAT_NAME |    21|     714|  1|00:00:01|
    |*4|    INDEX RANGE SCAN  |IND_SALES_PROD_QTY| 12762|   89334| 42|00:00:01|
    ---------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ------------------------------------------
    * 3 - access("P"."PROD_CATEGORY_ID"=203)
    * 4 - access("P"."PROD_ID"="S"."PROD_ID")
    

    该报告表明,使用两个新索引的新执行计划的性能要优于原始计划。

  12. 实施演进任务的建议。

    例如,执行以下IMPLEMENT_EVOLVE_TASK功能:

    EXECUTE :cnt := DBMS_SPM.IMPLEMENT_EVOLVE_TASK( task_name=>:tk_name, execution_name=>:exe_name );
    
  13. 查询数据字典以确保新计划被接受。

    该查询提供以下示例输出:

    SELECT SQL_HANDLE, SQL_TEXT, PLAN_NAME, ORIGIN, ENABLED, ACCEPTED
    FROM   DBA_SQL_PLAN_BASELINES
    WHERE  SQL_HANDLE IN ('SQL_07f16c76ff893342')
    ORDER BY SQL_HANDLE, ACCEPTED;
    
    SQL_HANDLE           SQL_TEXT             PLAN_NAME                      ORIGIN       ENA ACC
    -------------------- -------------------- ------------------------------ ------------ --- ---
    SQL_07f16c76ff893342 SELECT /* q1_group_b SQL_PLAN_0gwbcfvzskcu20135fd6c AUTO-CAPTURE YES YES
                         y */ prod_name, sum(
                         quantity_sold)
                         FROM   products p, s
                         ales s
                         WHERE  p.prod_id = s
                         .prod_id
                         AND    p.prod_catego
                         ry_id =203
                         GROUP BY prod_name
     
    SQL_07f16c76ff893342 SELECT /* q1_group_b SQL_PLAN_0gwbcfvzskcu242949306 AUTO-CAPTURE YES YES
                         y */ prod_name, sum(
                         quantity_sold)
                         FROM   products p, s
                         ales s
                         WHERE  p.prod_id = s
                         .prod_id
                         AND    p.prod_catego
                         ry_id =203
                         GROUP BY prod_name
    

    输出显示新计划已被接受。

  14. 在示例之后进行清理。

    例如,输入以下语句:

    EXEC :cnt := DBMS_SPM.DROP_SQL_PLAN_BASELINE('SQL_07f16c76ff893342');
    EXEC :cnt := DBMS_SPM.DROP_SQL_PLAN_BASELINE('SQL_9049245213a986b3');
    EXEC :cnt := DBMS_SPM.DROP_SQL_PLAN_BASELINE('SQL_bb77077f5f90a36b');
    EXEC :cnt := DBMS_SPM.DROP_SQL_PLAN_BASELINE('SQL_02a86218930bbb20');
    DELETE FROM SQLLOG$;
    CONNECT sh
    -- enter password
    DROP INDEX IND_SALES_PROD_QTY_SOLD;
    DROP INDEX IND_PROD_CAT_NAME;

也可以看看:

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论