oracle SQL计划管理 3

2023年 12月 7日 24.5k 0

1.1.1.1   显示SQL计划基线

通过dbasql_plan_baseline视图(从12.1版本之后,也可以查询cdb_sql_plan_baselines视图)可以显示可用SQL计划基线的基本信息。要显示详细信息,可以使用dbms_xplan包下的display_sql_plan_baseline函数。请注意它与第10章讨论的dbms_xplan包下的另一个函数相似。下面的例子展示了它可以显示的信息:

select * FROM table(dbms_xplan.display_sql_plan_baseline(sql_handle
=>'SQL_a971650b23f790eb7'));

 

警告 要想在11.1版本和11.2版本中正确显示SQL计划基线的信息,display_sql_plan_baseline函数必须能够重现与其关联的执行计划。如果函数无法实现,它会返回错误的结果甚至报错信息。为了避免这样的问题,从12.1版本开始,执行计划为了报告而存储在SQL基础管理平台中。可以执行baseline_unreproducible.sql脚本来观察输出结果以免存在不可重现的执行计划。

 

不幸的是,必须在11.1版本中查询数据字典来显示与SQL计划基线关联的hint列表。下面的SQL语句显示了一个示例。请注意,由于hint被存储成XML格式,因此需要转换成可读的输出:

select extractValue(value(h),'.') AS hint

FROM 
sys.sqlobj$data od, sys.sqlobj$ so,

 
table(xmlsequence(extract(xmltype(od.comp_data),'/outline_data/hint')))
h

WHERE
so.name='SQL_PLAN_9fskhq8zrk3pr3fdbb376'

AND so.signature = od.signature

AND so.category = od.category

AND so.obj_type = od.obj_type

AND so.plan_id = od.plan_id;

 

然而,从11.2版本之后,也同样可以使用display_sql_plan_baseline函数来显示hint列表。实际上,对于dbms_xplan包下的其他函数,format参数都可以用来影响它们的输出。下面的例子引用自将format参数设置为outline时产生的输出:

select * FROM
table(dbms_xplan.display_sql_plan_baseline(sql_handle=>'SQL_971650b23f790eb7',format=>'outline'));

 

Outline Data from SMB:

/*+

BEGIN_OUTLINE_DATA

IGNORE_OPTIM_EMBEDDED_HINTS

OPTIMIZER_FEATURES_ENABLE('11.2.0.3')

DB_VERSION('11.2.0.3')

ALL_ROWS

OUTLINE_LEAF(@"SEL$1")

FULL(@"SEL$1"
"T"@"SEL$1")

END_OUTLINE_DATA

*/

 

1.1.1.2   进化SQL计划基线

如果查询优化器生成的执行计划不是与它正在优化的SQL语句相关联的SQL计划基线中的现有执行计划,就会将一个新的未接受的执行计划自动添加到SQL计划基线中。即使查询优化器无法立即使用未接受的执行计划时也会发生。

 

这样做的目的是保留存在另一个可能更好的执行计划的信息。要验证一个未接受的执行计划是否要比SQL计划基线生成的执行计划更好时,就必须尝试进化(evolution)。这仅仅是要求SQL引擎用不同的执行计划执行SQL语句,并查明未接受的SQL计划基线的性能是否比接受的SQL计划基线的性能更好。如果答案是肯定的,则会将未接受的SQL计划基线设置为接受。

 

警告 在进化期间SQL引擎使用特殊的方式处理SQL语句。实际上,对于INSERT/UPDATE/MERGE/DELETE语句,只是访问数据而不会修改数据。因此,SQL语句仅是部分执行。然而,我认为这没什么问题。实际上,修改数据的操作总是会执行相同的工作,而并不取决于如何访问修改的数据。

 

可以使用dbms_spm包下的evolve_sql_plan_baseline函数来执行进化。要调用这个函数,除了使用SQL_handle和/或plan_name参数来确定SQL计划基线外,还需要以下参数。

Ø  time_limit:以分钟为单位,进化可持续的时间。这个参数接受自然数或dbms_spm.auto_limit和dbms_spm.no_limit常量。

Ø  Verify:如果设置为yes(默认),则会执行SQL语句以验证性能。如果设置为no,就不会执行验证,并且SQL计划基线也会简单地变为接受。

Ø  Commit:如果设置为yes(默认),数据字典会根据进化的结果做修改。如果设置为no,并且verify参数设置为yes,则会执行验证,但不修改数据字典。

 

报告是函数的返回值,它提供了进化的详细信息。下面的例子,引用自baseline_automatic.sql脚本生成的输出,显示SQL语句用来启动进化,并且结果报告指出SQL计划基线被进化了(包括导致这个决定的统计信息):

select
dbms_spm.evolve_sql_plan_baseline(sql_handle => 'SQL_492bdb47e8861a89',

                                           
plan_name  => '',

                                           
time_limit => 10,

                                           
verify     => 'yes',

                                           
commit     => 'yes')

from dual;

p367

 

除了刚刚介绍的手动进化外,SQL计划基线的自动进化需要Tuning Pack选件支持。原因是,在维护窗期间,SQL优化顾问处理SQL语句会对系统造成重大影响。在可能的情况下,优化顾问提供建议来改进它们的响应时间。

 

如果优化顾问注意到未接受的SQL计划基线比接受的SQL计划基线的性能更好,它会建议SQL配置文件使用接受的SQL计划基线。显然,如果接受SQL配置文件,则也会接受SQL计划基线。因此,只要SQL计划基线自动接受,那么SQL优化顾问生成的SQL配置文件也会自动接受。

 

必须要指出的是SQL配置文件只有在针对SQL优化顾问的accept_sql_profile参数设置为TRUE时才会自动接受。默认情况下是FALSE。你可以借助类似以下查询通过dba_advisor_parameters视图检查它的值(请注意,同样user和12.1及之后版本中与cdb相关的视图也存在):

 

select parameter_value FROM
dba_advisor_parameters WHERE task_name='SYS_AUTO_SQL_TUNING_TASK' AND
parameter_name='ACCEPT_SQL_PROFILES';

 

dbms_auto_sqltune包提供了set_auto_tuning_task_parameter过程用来更改accept_sql_profiles参数的值。下面的例子展示如何将参数设置为TRUE来激活SQL配置文件的自动接受:

dbms_auto_sqltune.set_auto_tuning_task_parameter(parameter=>'ACCEPT_SQL_PROFILES',value=>'TRUE');

 

从12.1版本开始,又有了一个新的顾问叫作SPM进化顾问(SPM Evolve Advisor)。它的目的是为与SQL计划基线相关联的未接受执行计划执行进化。它在维护窗期间执行,这一点与其他顾问一样。可以使用dbms_spm包下的report_auto_evolve_task函数来显示SPM进化顾问都做了什么。

 

如果只调用这个函数而不加任何参数,它会显示最后一次执行的报告。下面的例子展示了当最后三次执行发生后,如何通过dba_advisor_executions视图找到它(请注意,同样user和12.1及之后版本中与cdb相关的视图也存在),以及如何显示某个执行的报告:

select *

FROM(

select_execution_name,execution_start

FROM dba_advisor_executions

WHERE task_name ='SYS_AUTO_SPM_EVOLVE_TASK'

ORDER BY execution_start DESC)

WHERE rownum 'EXEC_6294') FROM dual;

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论