一. 用途介绍
dbms_xplan包用于展示执行计划。执行计划存储在计划表中,库缓存中和AWR中,dbms_xplan包能从这些地方将执行计划取出,格式化之后展示给我们。
二. dbms_xplan输出
dbms_xplan的输出就是执行计划的信息,从上往下看一般是这样的:
第一部分:
child number:这个sql_id子游标序号,识别子游标
SQL文本内容:展示的是该执行计划是哪条SQL语句对应的
第二部分:
展示的是这条SQL语句被拆分成好几步来执行,提供了每一步的评估和运行统计。
id列:步骤序号,如果前面有*,表示这一步会根据某一个过滤条件过滤数据。
opration列:执行的操作,比如索引扫描,选择数据,表连接等等。
name列:操作的对象,比如序号为3的操作是针对表主键T_PK的操作。
rows:此操作返回的记录条数。
bytes:此操作返回的记录字节数。
cost(%cpu):操作的开销,这是一个累计值。(我们可以看到序号4的操作开销最大)括号里面的值是cpu开销的百分比,比如0操作的百分比是97%,1操作的百分比是3%。
time:操作需要的时间,这也是一个累计值。(注意这个值可能不准确,因为oracle是采样计算的这个值)
第三部分:
接着我们会看到这样一部分信息:
这里说明的是过滤数据步骤的具体过滤条件,比如:序号为4的过滤条件是T1.ID > 6. 注意前缀,序号4的为filter,说明是全表扫描T1,然后按照条件过滤,序号3为access,说明是按照指定的条件去有目的的访问。
第四部分:
我们可能在下面还是会看到这样一部分信息:
说明的是每一步骤具体返回的字段信息,比如序号为4的步骤返回的是T1.N列。
三. display函数
调用display函数用于展示存储在计划表中的执行计划,格式如下:
select * from table(dbms_xplan.display(table_name,statement_id,format,filter_preds))
table_name:指定计划表的名字,默认值为plan_table,填null代表取默认值。
statement_id:指定sql语句的名字,默认值为null,代表显示最近插入计划表的执行计划。
format:输出内容的格式,基本的有:basic,typical,serial,all和advanced. basic:显示的是最基本的信息,advanced显示的是最全的信息。具体见下图:
filter_preds:指定在查询计划表时,添加一个约束,比如statement_id ='test3',默认值为null,表示显示最近插入计划表的执行计划。
示例如下:
basic的结果:
advanced的结果:
四. display_cursor函数
该函数显示存储在库缓存中的执行计划,格式如下所示:
select * from table(dbms_xplan.display_cursor(sql_id,cursor_child_no,format))
sql_id:被指定返回执行计划的SQL语句的父游标,默认值为null,代表返回当前会话最后被执行的SQL语句的执行计划。
cursor_child_no:指定父游标下子游标的序号,默认值为0,如果设定为null,代表返回所有的子游标的执行计划。
format:跟display函数一样。