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

Oracle 19C 用于计划比较的执行计划的工具:DBMS_XPLAN.COMPARE_PLANS

原创 Asher.HU 2021-02-04
1792


您可以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的计划源

计划来源规格描述

计划表

plan_table_object(owner, plan_table_name, statement_id, plan_id)

参数如下:

  • owner—计划表的所有者
  • plan_table_name—计划表的名称
  • statement_id—语句的ID(可选)
  • plan_id—计划的ID(可选)

游标缓存

cursor_cache_object(sql_id, child_number)

参数如下:

  • sql_id—计划的SQL ID
  • child_number—游标缓存中计划的子代号(可选)

AWR

awr_object(sql_id, dbid, con_dbid, plan_hash_value)

参数如下:

  • sql_id—计划的SQL ID
  • dbid—数据库ID(可选)
  • con_dbid—CDB ID(可选)
  • plan_hash_value—计划的哈希值(可选)

SQL调优集

sqlset_object (sqlset_owner, sqlset_name, sql_id, plan_hash_value)

参数如下:

  • sqlset_owner— SQL调优集的所有者
  • sqlset_name-SQL调整集的名称
  • sql_id—计划的SQL ID
  • plan_hash_value—计划的哈希值(可选)

SQL计划管理

spm_object (sql_handle, plan_name)

参数如下:

  • sql_handle-受SQL计划管理保护的计划的SQL句柄
  • plan_name-SQL计划基线的名称(可选)

SQL配置文件

sql_profile_object (profile_name)

profile_name参数指定SQL配置文件的名称。

顾问

advisor_object (task_name, execution_name, sql_id, plan_id)

参数如下:

  • task_name—顾问任务的名称
  • execution_name—任务执行的名称
  • sql_id—计划的SQL ID
  • plan_id—顾问计划ID(可选)

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函数的参数

参数描述

reference_plan

指定一个类型的计划generic_plan_object

compare_plan_list

指定计划对象列表。一个对象可能对应一个或多个计划。


示例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_tableplan_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软件包的 更多信息




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

评论