Oracle sql tune report使用

首先,sql必须是绑定变量的,其中如果有常量,常量应该是不变的。

使用sqltrpt脚本进行分析,会得到分析报告的:
sqlplus / as sysdba
@?/rdbms/admin/sqltrpt

分析报告中,主要关注5种建议:
1)重新收集统计信息

2)重写sql where中的不佳部分,例如,有索引列被放到函数中的

3)建议建立相关表的索引

4)通过分析sql找到的新的执行计划
这个,在满足绑定变量前提的情况下,就可以考虑使用建议的sql profile。

一般的报告中,关于这个会有:

  Recommendation (estimated benefit: 92.33%)
  ------------------------------------------
  - 考虑接受推荐的 SQL 概要文件。
    execute dbms_sqltune.accept_sql_profile(task_name =>
            'TASK_121170', object_id => 156991, replace => TRUE);

  Validation results
  ------------------
  已对 SQL profile 进行测试, 方法为执行其计划和原始计划并测量与计划相对应的执行统计信息。如果其中一个计划运行在很短的时间内就完成,
  则另一计划可能只执行了一部分。

                           Original Plan  With SQL Profile  % Improved
                           -------------  ----------------  ----------
  Completion Status:            COMPLETE          COMPLETE
  Elapsed Time (s):           17.739999          2.042237      88.48 %
  CPU Time (s):               17.579328          2.020693       88.5 %
  User I/O Time (s):                  0                 0
  Buffer Gets:                  6778526            519281      92.33 %
  Physical Read Requests:             0                 0
  Physical Write Requests:            0                 0
  Physical Read Bytes:                0                 0
  Physical Write Bytes:               0                 0
  Rows Processed:                     1                 1
  Fetches:                            1                 1
  Executions:                         1                 1

查看这个列表,可以知道使用sql profile前后的变化情况。
使用上面这个exec就可以把sql profile应用进去。
注意,如果报告ORA-错,多半是空格问题,把括号中的空格都去掉:
execute dbms_sqltune.accept_sql_profile(task_name=>'TASK_121170',object_id=>156991,replace=>TRUE);

注意,如果是这种DBMS_SQLTUNE.PX_PROFILE的:
  Recommendation (estimated benefit: 99.78%)
  ------------------------------------------
  - 考虑接受建议的 SQL 概要文件, 以便对此语句使用并行执行。
    execute dbms_sqltune.accept_sql_profile(task_name =>
            'SYS_AUTO_SQL_TUNING_TASK', object_id => 156991, replace => TRUE,
            profile_type => DBMS_SQLTUNE.PX_PROFILE);
这种是加并行度到和逻辑核数一样,是不可以接受的。如果业务要加并行,可以直接加hint到sql中。


5)查找AWR和cursor cache找到的老的执行计划
这个,在满足绑定变量前提的情况下,就可以考虑使用建议的sql profile。

一般的报告中,关于这个会有:

  The following table lists these plans ranked by their average elapsed time.
  See section "ALTERNATIVE PLANS SECTION" for detailed information on each
  plan.

  id plan hash  last seen            elapsed (s)  origin          note
  -- ---------- -------------------- ------------ --------------- ----------------
   1 2917356173  2018-05-31/12:04:29        2.385 Cursor Cache
   2 4217098558  2018-05-30/12:17:10        2.410 Cursor Cache    original plan

  Recommendation
  --------------
  - 请考虑使用最佳平均用时为计划创建 SQL 计划基线。
    execute dbms_sqltune.create_sql_plan_baseline(task_name =>
            'TASK_121167', owner_name => 'SYS', plan_hash_value
            => 2917356173);

或者:

  The following table lists these plans ranked by their average elapsed time.
  See section "ALTERNATIVE PLANS SECTION" for detailed information on each
  plan.

  id plan hash  last seen            elapsed (s)  origin          note
  -- ---------- -------------------- ------------ --------------- ----------------
   1 2177557362  2018-05-10/08:00:04        0.064 AWR

  Information
  -----------
  - 因为找不到原始计划的任何执行历史记录, SQL 优化指导无法确定这些执行计划中是否有一些执行计划优于原始计划。但是,
    如果您知道某个替代计划优于原始计划, 可以为该替代计划创建 SQL 计划基线。这将指示 Oracle 优化程序在将来优先于任何其他选择来选取它。
    execute dbms_sqltune.create_sql_plan_baseline(task_name =>
            'TASK_121167', owner_name => 'SYS', plan_hash_value
            => 2177557362);

使用上面这个exec就可以建立sql plan基线。
注意,如果报告ORA-错,多半是空格问题,把括号中的空格都去掉:
dbms_sqltune.create_sql_plan_baseline(task_name=>'TASK_121167',owner_name=>'SYS',plan_hash_value=>2177557362);

不管是sql profile还是sql plan基线,我们一般除非万不得已或者比较急都不会使用它们,让业务改sql是最好的。因为有几个问题:
1、如果业务升级sql有任何细微改动,都会导致它们失效;
2、大量使用后,我们自己也容易忘掉有哪些sql使用了它们;
 

你可能感兴趣的:(ORACLE,ORACLE,优化)