oracle SQL计划管理(转)

2023年 12月 11日 32.2k 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数据库

发布评论