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一样。这个参数已经不推荐使用,并只是为了向后兼容而提供 |




