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

dbms_xplan包 - display 函数

原创 不吃草的牛_Nick 2023-11-05
362

   display 函数

display函数返回计划表中存储的执行计划。返回值是dbms_xplan_type_table集合的实例。集合的元素是dbms_xplan_type对象类型的实例。这种对象类型的唯一属性,即plan_table_output,其类型是VARCHAR2(300)。此函数有以下输入参数。

Ø  table_name指定计划表的名称。默认值是plan_table。如果指定了NULL,则使用默认值。

Ø  statement_id指定SQL语句的名称,当执行EXPLAIN PLAN语句的时候,作为一个可选参数给出。默认值是NULL。如果使用了默认值,则显示最近一次插入计划表的执行计划(如果没有指定filter_preds参数)。

Ø  format指定在输出中提供哪些信息。可以使用基本值(basic、typical、serial、all及advanced),想要精细控制,可以向它们添加额外的修饰符(adaptive、alias、bytes、cost、note、outline、parallel、partition、peeked_binds、predicate、projection、remote、report及rows)。

a.如果有应该添加的信息,可以选择使用+这个字符作为前缀的修饰符(例如,basic +predicate)。

b.如果有应该移除的信息,可以选择使用-这个字符作为前缀的修饰符(例如,typical -bytes)。

c.可以同时指定多个修饰符(例如,typical +alias -bytes -cost)。

表10-2和表10-3分别完整描述了基本值和修饰符。默认值是typical。

Ø  filter_preds指定查询计划表时应用的限制条件。此限制条件为基于计划表中的一个列的常规SQL谓词(例如,statement_id='test3')。默认值是NULL。如果使用了默认值,则会显示最近一次插入到计划表的执行计划。

 

表10-2 format参数接受的基本值

描述

basic

只显示最少的信息量,基本上只有操作和执行所针对的对象

typical

显示最常见的信息,基本上包含所有的信息,除了别名、概要、扫视的绑定变量、子计划、列投影以及报告模式信息

serial

与typical类似,除了关于并行处理的信息没有显示

all

显示除了概要、扫视的绑定变量、子计划以及报告模式信息以外的所有可用信息

advanced

显示除了子计划和报告模式信息之外的所有可用信息

表10 - 3format参数接受的修饰符

描 述

adaptive

控制子计划的显示。这部分在之前的例子中没有展示过。这个修饰符仅从12.1版本开始才可用

alias

控制包含查询块名称和对象别名部分的显示

bytes

控制执行计划表中Bytes列的显示

cost

控制执行计划表中Cost列的显示

note

控制包含注释部分的显示

outline

控制包含概要部分的显示

parallel

控制并行处理信息的显示,特别是指执行计划表中的TQ、IN-OUT和PQ Distrib列。这些列在之前的例子中没有显示过

partition

控制分区信息的显示,明确地说是执行计划表中的Pstart和Pstop列。这些列在之前的例子中没有显示过

peeked_binds

控制包含扫视的绑定变量部分的显示。

predicate

控制包含过滤谓词、访问谓词和存储谓词的部分的显示

projection

控制包含列投影信息的部分的显示

remote

控制远程执行的SQL语句的显示。这部分在之前的例子中没有显示

report

控制报告模式的激活。启用时,关于自适应和重新优化执行计划的额外信息就会显示出来。这部分在之前的例子中没有显示。这个修饰符仅从12.1版本开始才可用

rows

控制执行计划表中Rows列的显示

 

要使用display函数,调用者只需要在该包上有EXECUTE权限并在计划表上拥有select权限。

 

下面的查询显示了相同的执行计划,展示了在基本值basic、typical以及advanced之间的主要区别。以下是对display.sq1脚本生成输出的一段摘录:

select * from table(dbms_xplan.display(null,null,'basic'));

select * from table(dbms_xplan.display(null,null,'typical'));

select * from table(dbms_xplan.display(null,null,'advanced'));

 

下面的查询展示了如何使用修饰符从基本值basic和typical生成的默认输出中添加或移除信息。因为它们基于与之前例子相同的查询,你可以对比输出结果来查看有何不同之处。以下是一段来自display.sql脚本输出的摘录:

select * from table(dbms_xplan.display(null,null,'basic +predicate'));

select * from table(dbms_xplan.display(null,null,'typical -bytes -note'));

 

将current_schema会话参数设置为一个拥有默认名称的计划表的模式时,如果你使用EXPLAIN PLAN语句和display函数,则必须在EXPLAIN PLAN语句的INTO子句中和display函数的table_name参数中加入该模式名称。如果不这么做就会导致display函数引发一个错误。下面的例子演示了该行为:

ALTER SESSION SET current_schema = franco;

EXPLAIN PLAN FOR select * FROM t;

select * FROM table(dbms_xplan.display);

 

PLAN_TABLE_OUTPUT

Error: cannot fetch last explain plan from PLAN_TABLE

 

EXPLAIN PLAN INTO franco.plan_table FOR select * FROM t;

select * FROM table(dbms_xplan.display(table_name=>'franco.plan_table'));

通过display函数也可以查询一张拥有基于v$sql_plan_statistics_all视图结构的计划表。在想要保存那些被有意设计为只在库缓存中短暂存在的信息时,这个特性就派上用场了。因为这样的计划表中包含额外的信息,当通过display函数查询它时,format参数支持接下来的部分描述的额外修饰符,详见表10-4。下面的例子展示了如何利用这个特性保存关于执行最后一条SQL语句时的信息:

SELECT /*+ gather_plan_statistics */ count(*) FROM t;

 

CREATE TABLE my_plan_table

AS

SELECT cast(1 AS VARCHAR2(30)) AS plan_id, p.*

FROM v$sql_plan_statistics_all p

WHERE (sql_id, child_number) = (SELECT prev_sql_id, prev_child_number

                                FROM v$session

                                WHERE sid = sys_context('userenv','sid'));

 

SELECT * FROM table(dbms_xplan.display('my_plan_table', NULL, 'iostats'));

 

表10-4 format参数接受的修饰符

描  述

allstats

这是iostats memstats的简写

iostats

控制运行时统计信息的显示(列Starts、A-Rows、A-Time)、估算的行数(列E-Rows)以及磁盘I/O统计信息(列Buffers、Reads,Writes)

last

默认情况下,allstats,iostats,memstats和rowstats修饰符都会显示所有执行的累积统计信息如果将这个值加入它们,则仅会显示最后一次执行的统计信息。为并行处理的SQL语句指定的这个修饰符可能并不会像你期望的那样工作。

memstats

控制内存使用的统计信息的显示(列0Mem、1Mem、0/1/M、Used-Mem、Used-Tmp、和Max-Tmp)

rowstats

控制行计数统计信息的显示(列Starts,E-Rows和A-Rows)。这个修饰符仅从11.2.0.4版本开始才可用

runstats_last

与iostats last一样。这个参数已经不推荐使用,并只是为了向后兼容而提供

runstats_tot

和iostats一样。这个参数已经不推荐使用,并只是为了向后兼容而提供

 

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

评论