您可以DBMS_XPLAN.COMPARE_PLANS用来生成文本,XML或HTML格式的报告。
比较计划报告格式
该报告以摘要开头。该COMPARE PLANS REPORT部分包括诸如运行报告的用户以及比较的计划数之类的信息,如以下示例所示:
COMPARE PLANS REPORT
-------------------------------------------------------------------------
Current user : SH
Total number of plans : 2
Number of findings : 1
-------------------------------------------------------------------------该COMPARISON DETAILS报告的部分包含以下信息:
- 计划信息 : 该信息包括计划编号,计划源,计划属性(视源而异),解析模式和SQL文本。
- 计划 : 此部分显示计划行,包括谓词和注释。
- 比较结果 : 本节总结了比较结果,重点介绍了逻辑差异,例如连接顺序,连接方法,访问路径和并行分发方法。结果从数字开始
1。对于与特定查询块相关的发现,文本以块的名称开头。对于与特定对象别名相关的发现,文本以查询块的名称和对象别名开头。下列Comparison Results (1): ----------------------------- 1. Query block SEL$1, Alias PRODUCTS@SEL$1: Some columns (OPERATION, OPTIONS, OBJECT_NAME) do not match between the reference plan (id: 2) and the current plan (id: 2).
DBMS_XPLAN.PLAN_OBJECT_LIST表类型
该plan_object_list类型允许将通用对象列表作为DBMS_XPLAN.COMPARE_PLANS函数的输入。语法如下:
TYPE plan_object_list IS TABLE OF generic_plan_object;通用对象从所有计划源中抽象出计划的公共属性。每个计划源都是plan_object_list超类的子类。下表总结了不同的计划来源。请注意,当可选参数为null时,它可以对应于多个对象。例如,如果您没有为指定子代号cursor_cache_object,则它将与所有具有指定SQL ID的游标缓存语句匹配。
表6-3 PLAN_OBJECT_LIST的计划源
| 计划来源 | 规格 | 描述 |
|---|---|---|
计划表 | | 参数如下:
|
游标缓存 | | 参数如下:
|
AWR | | 参数如下:
|
SQL调优集 | | 参数如下:
|
SQL计划管理 | | 参数如下:
|
SQL配置文件 | | 该 |
顾问 | | 参数如下:
|
DBMS_XPLAN.COMPARE_PLANS函数
比较计划工具的界面具有以下功能:
DBMS_XPLAN.COMPARE_PLANS(
reference_plan IN generic_plan_object,
compare_plan_list IN plan_object_list,
type IN VARCHAR2 := 'TEXT',
level IN VARCHAR2 := 'TYPICAL',
section IN VARCHAR2 := 'ALL')
RETURN CLOB;
下表描述了指定要比较的计划的参数。
表6-4 COMPARE_PLANS函数的参数
| 参数 | 描述 |
|---|---|
| 指定一个类型的计划 |
| 指定计划对象列表。一个对象可能对应一个或多个计划。 |
示例6-8从子光标比较计划
本示例将SQL ID 8mkxm7ur07za0 的子游标编号2的计划与相同SQL ID的子游标编号4的计划进行比较。 (在内存中的执行计划进行比较)
VAR v_report CLOB;
BEGIN
:v_report := DBMS_XPLAN.COMPARE_PLANS(
reference_plan => CURSOR_CACHE_OBJECT('8mkxm7ur07za0', 2),
compare_plan_list => PLAN_OBJECT_LIST(CURSOR_CACHE_OBJECT('8mkxm7ur07za0', 4)));
END;
/
PRINT v_report示例6-9将子游标中的计划与SQL计划基准中的计划进行比较
本示例将SQL ID的2号子游标8mkxm7ur07za0的计划与SQL计划基线中的计划进行比较。基准查询的SQL句柄为SQL_024d0f7d21351f5d,计划名称为SQL_PLAN_sdfjkd。
VAR v_report CLOB;
BEGIN
:v_report := DBMS_XPLAN.COMPARE_PLANS( -
reference_plan => CURSOR_CACHE_OBJECT('8mkxm7ur07za0', 2),
compare_plan_list => PLAN_OBJECT_LIST(SPM_OBJECT('SQL_024d0f7d21351f5d', 'SQL_PLAN_sdfjkd')));
END;
PRINT v_report示例6-10将计划与多个来源的计划进行比较
本示例仅打印摘要部分。该程序将SQL ID的子游标编号2的8mkxm7ur07za0计划与以下列表中的每个计划进行比较:
- 为SQL ID生成的共享SQL区域中的所有计划
8mkxm7ur07za0 - 在SQL调整集中
SH. SQLT_WORKLOAD为SQL ID 生成的所有计划6vfqvav0rgyad - AWR中针对数据库ID 5和SQL ID捕获的所有计划
6vfqvav0rgyad SQL_024d0f7d21351f5d具有名称的句柄的查询的计划基线SQL_PLAN_sdfjkd- 该计划存储在
sh.plan_table由plan_id=38 - SQL概要文件名称标识的计划
pe3r3ejsfd - 所有存储在SQL Advisor中的计划均由任务名称
TASK_1228,执行名称EXEC_1928和SQL ID标识8mkxm7ur07za0
VAR v_report CLOB
BEGIN
:v_report := DBMS_XPLAN.COMPARE_PLANS(
reference_plan => CURSOR_CACHE_OBJECT('8mkxm7ur07za0', 2),
compare_plan_list => plan_object_list(
cursor_cache_object('8mkxm7ur07za0'),
sqlset_object('SH', 'SQLT_WORKLOAD', '6vfqvav0rgyad'),
awr_object('6vfqvav0rgyad', 5),
spm_object('SQL_024d0f7d21351f5d', 'SQL_PLAN_sdfjkd'),
plan_table_object('SH', 'plan_table', 38),
sql_profile_object('pe3r3ejsfd'),
advisor_object('TASK_1228', 'EXEC_1928', '8mkxm7ur07za0')
),
type => 'XML',
level => 'ALL',
section => 'SUMMARY');
END;
/
PRINT v_report注意:
《 Oracle数据库PL / SQL软件包和类型参考》以获取有关该DBMS_XPLAN软件包的 更多信息




