`
womendu
  • 浏览: 1524261 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

dbms_xplan之display函数的使用

 
阅读更多
DBMS_XPLAN包包括一系列函数,主要是用于显示SQL语句的执行计划,且不同的情形下使用不同的函数来显示,如预估的执行计划则使用
display函数,而实际的执行计划则是用display_cursor函数,对于awr中的执行计划,则是用display_awr函数,而SQL tuning集合中的执行计划
则由display_sqlset来完成。本文主要描述DBMS_XPLAN包中display函数的使用,尽管可以通过SQL语句来查询缺省表plan_table来获得执行计划,
事实上,使用display函数更便捷,且display函数提供了多种不同的显示格式。

一、DBMS_XPLAN包中的函数
[sql] view plaincopyprint?
SQL> desc dbms_xplan --> 列出几个常用的
FUNCTION DISPLAY RETURNS DBMS_XPLAN_TYPE_TABLE
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
TABLE_NAME VARCHAR2 IN DEFAULT
STATEMENT_ID VARCHAR2 IN DEFAULT
FORMAT VARCHAR2 IN DEFAULT
FILTER_PREDS VARCHAR2 IN DEFAULT
FUNCTION DISPLAY_AWR RETURNS DBMS_XPLAN_TYPE_TABLE
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SQL_ID VARCHAR2 IN
PLAN_HASH_VALUE NUMBER(38) IN DEFAULT
DB_ID NUMBER(38) IN DEFAULT
FORMAT VARCHAR2 IN DEFAULT
FUNCTION DISPLAY_CURSOR RETURNS DBMS_XPLAN_TYPE_TABLE
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
SQL_ID VARCHAR2 IN DEFAULT
CURSOR_CHILD_NO NUMBER(38) IN DEFAULT
FORMAT VARCHAR2 IN DEFAULT
二、display函数
1、display函数的几个参数
table_name
指定计划表的名字,缺省值为'PLAN_TABLE'.
statement_id
SQL语句的ID号,是在生成执行计划时使用set statement_id名令设定的值,默认值为NULL,当使用默认值时,将显示最近
插入计划表中的执行计划(filter_preds参数的值为空时)
format
用于控制display函数输出的内容。其常用取值为basic,typical,serial,all,advanced。其中typical为缺省值
除了上述几个取值外,还可以配合一些额外的修饰符来显示不同的内容。如:
alias、bytes、cost、note、outline、parallel、paration、predicate等
常用取值组合修饰符的例子:
basic +predicate、basic +outline(需要某个修饰符使用"+"号来连接)
typical -bytes、typical +alias -bytes -cost(不需要某个修饰符使用"-"号来连接)
注:"+"号与"-"号前面应保留空格
filter_preds
过滤谓词。用于过滤从plan_table表中返回的记录。当该值为NULL时,执行计划显示最近插入计划表中的执行计划。
如:filter_preds=>'plan_id = 223'
2、format参数常用值描述
basic 仅仅显示最少的信息。基本上包括操作和操作的对象
typical 显示大部分信息。基本上包括除了别名,提纲和字段投影外的所有信息,此为缺省值。
serial 类似于typical,但不显示并行操作
all 显示除提纲之外的所有信息
advanced 显示所有信息
3、format参数修饰符
alias 控制包含查询块与别名的显示部分
bytes 控制执行计划表中字段bytes的显示
cost 控制执行计划表中字段cost的显示
note 控制包含注释信息的显示部分
outline 控制包含提纲信息的显示部分
parallel 控制包含并行处理信息的提示
partition 控制并行处理信息的显示,尤其是执行计划表中字段TQ、IN-OUT、PQ Distrib的显示
peeked_binds 控制包含绑定变量窥探部分的显示。仅当生成执行计划时使用了绑定变量是可见
predicate 控制包含谓词filter和access显示部分
projection 控制包含投影信息的显示部分
remote 控制远程执行的SQL语句的显示
rows 控制执行计划表中字段rows的显示

三、演示使用display函数获取执行计划(演示版本Oracle 10g R2)
1、使用EXPLAIN PLAN加载预估的执行计划
[sql] view plaincopyprint?
SQL> EXPLAIN PLAN SET STATEMENT_ID='TSH' FOR
2 SELECT *
3 FROM emp e, dept d
4 WHERE e.deptno = d.deptno
5 AND e.ename = 'SMITH';

Explained.
2、使用display函数查看执行计划
[sql] view plaincopyprint?
/*------------- 使用了basic模式,且指定了table_name,statement_id -----------------*/
/**************************************************/
/* Author: Robinson Cheng */
/* Blog: http://blog.csdn.net/robinson_0612 */
/* MSN: robinson_0612@hotmail.com */
/* QQ: 645746311 */
/**************************************************/
SQL> SET LINESIZE 130
SQL> SELECT *
2 FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','TSH','BASIC'));

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------
Plan hash value: 351108634

------------------------------------------------
| Id | Operation | Name |
------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | NESTED LOOPS | |
| 2 | TABLE ACCESS FULL | EMP |
| 3 | TABLE ACCESS BY INDEX ROWID| DEPT |
| 4 | INDEX UNIQUE SCAN | PK_DEPT |
------------------------------------------------

11 rows selected.

/*---------------- 使用basic +predicate模式--------------------*/
SQL> set pagesize 0
SQL> select * from table(dbms_xplan.display(null,'TSH','basic +predicate'));
Plan hash value: 351108634

------------------------------------------------
| Id | Operation | Name |
------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | NESTED LOOPS | |
|* 2 | TABLE ACCESS FULL | EMP |
| 3 | TABLE ACCESS BY INDEX ROWID| DEPT |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT |
------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter("E"."ENAME"='SMITH')
4 - access("E"."DEPTNO"="D"."DEPTNO")

17 rows selected.

/*--------------- 使用typical模式当format为null时的缺省模式 ------------*/
SQL> select * from table(dbms_xplan.display(null,'TSH','typical'));
Plan hash value: 351108634

----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 117 | 4 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 1 | 117 | 4 (0)| 00:00:01 |
|* 2 | TABLE ACCESS FULL | EMP | 1 | 87 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 30 | 1 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 00:00:01 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter("E"."ENAME"='SMITH')
4 - access("E"."DEPTNO"="D"."DEPTNO")

Note
-----
- dynamic sampling used for this statement

21 rows selected.

/*------------- 查看plan_table中STATEMENT_ID为TSH的PLAN_ID值-------------------*/
SQL> select statement_id,plan_id from plan_table where rownum<2;

STATEMENT_ID PLAN_ID
------------------------------ ----------
TSH 223

/*-------------- 使用了advanced -bytes模式,且指定了filter_preds为223 -------------*/
SQL> select * from table(dbms_xplan.display(null,null,'advanced -bytes','plan_id = 223'));
Plan hash value: 351108634

--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 4 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 1 | 4 (0)| 00:00:01 |
|* 2 | TABLE ACCESS FULL | EMP | 1 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 1 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | 0 (0)| 00:00:01 |
--------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

1 - SEL$1
2 - SEL$1 / E@SEL$1
3 - SEL$1 / D@SEL$1
4 - SEL$1 / D@SEL$1

Outline Data
-------------

/*+
BEGIN_OUTLINE_DATA
USE_NL(@"SEL$1" "D"@"SEL$1")
LEADING(@"SEL$1" "E"@"SEL$1" "D"@"SEL$1")
INDEX_RS_ASC(@"SEL$1" "D"@"SEL$1" ("DEPT"."DEPTNO"))
FULL(@"SEL$1" "E"@"SEL$1")
OUTLINE_LEAF(@"SEL$1")
ALL_ROWS
OPTIMIZER_FEATURES_ENABLE('10.2.0.3')
IGNORE_OPTIM_EMBEDDED_HINTS
END_OUTLINE_DATA
*/

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter("E"."ENAME"='SMITH')
4 - access("E"."DEPTNO"="D"."DEPTNO")

Column Projection Information (identified by operation id):
-----------------------------------------------------------

1 - (#keys=0) "E"."EMPNO"[NUMBER,22], "E"."ENAME"[VARCHAR2,10],
"E"."JOB"[VARCHAR2,9], "E"."MGR"[NUMBER,22], "E"."HIREDATE"[DATE,7],
"E"."SAL"[NUMBER,22], "E"."COMM"[NUMBER,22], "E"."DEPTNO"[NUMBER,22],
"D"."DEPTNO"[NUMBER,22], "D"."DNAME"[VARCHAR2,14],
"D"."LOC"[VARCHAR2,13]
2 - "E"."EMPNO"[NUMBER,22], "E"."ENAME"[VARCHAR2,10],
"E"."JOB"[VARCHAR2,9], "E"."MGR"[NUMBER,22], "E"."HIREDATE"[DATE,7],
"E"."SAL"[NUMBER,22], "E"."COMM"[NUMBER,22], "E"."DEPTNO"[NUMBER,22]
3 - "D"."DEPTNO"[NUMBER,22], "D"."DNAME"[VARCHAR2,14],
"D"."LOC"[VARCHAR2,13]
4 - "D".ROWID[ROWID,10], "D"."DEPTNO"[NUMBER,22]

Note
-----
- dynamic sampling used for this statement

60 rows selected.

/*---------------- 既有"+"也有"-"修饰符的情形-----------------------*/
SQL> select * from table(dbms_xplan.display(null,null,'typical +alias -bytes -cost'));
Plan hash value: 351108634

-------------------------------------------------------------------
| Id | Operation | Name | Rows | Time |
-------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 00:00:01 |
| 1 | NESTED LOOPS | | 1 | 00:00:01 |
|* 2 | TABLE ACCESS FULL | EMP | 1 | 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | 00:00:01 |
-------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

1 - SEL$1
2 - SEL$1 / E@SEL$1
3 - SEL$1 / D@SEL$1
4 - SEL$1 / D@SEL$1

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter("E"."ENAME"='SMITH')
4 - access("E"."DEPTNO"="D"."DEPTNO")

Note
-----
- dynamic sampling used for this statement

29 rows selected.
四、总结
1、display函数仅仅针对预估的执行计划,而不是实际的执行计划
2、display函数显示了预估的执行计划且显示格式灵活,可以以不同的输出格式呈现
3、当所有参数为null的情况下,显示执行计划表中(缺省为plan_table)最后一条语句的执行计划
4、尽管可以通过SQL语句查询plan_table来获取执行计划,建议直接使用display函数,这足够说明一切问题
5、当SQL语句中使用了绑定变量时,由explain plan获得的执行计划是不可靠的
分享到:
评论

相关推荐

    Re-post: DBMS_XPLAN : Display Oracle Execution Plans

    1. `xplan.package.sql` - 这可能是一个创建或调整DBMS_XPLAN包的脚本,包含定义函数和过程的源代码,用户可以使用这些函数和过程来获取执行计划信息。 2. `xplan.display_awr.sql` - AWR(Automatic Workload ...

    Oracle中使用DBMS_XPLAN处理执行计划详解

    在以前查看SQL执行计划的时候,我都是使用set autotrace命令,不过现在看来,DBMS_XPLAN包给出了更加简化的获取和显示计划的方式。 这5个函数分别对应不同的显示计划的方式,DBMS_XPLAN包不仅可以获取解释计划,它还...

    获取SQL语句的执行计划v1

    2. **查看执行计划**:使用`dbms_xplan.display()`函数来查看生成的执行计划。 ```sql select * from table(dbms_xplan.display()); ``` 3. **查看高级执行计划**:如果需要查看更详细的执行计划信息,可以使用...

    oracle的索引学习

    总之,Oracle的索引学习涵盖了从索引创建、选择合适的索引类型、理解数据操作对索引的影响,到使用Autotrace和DBMS_XPLAN进行性能分析等多个方面。深入理解和实践这些知识点,能帮助我们更好地管理和优化Oracle...

    Oracle中获取执行计划的几种方法分析

    通过查询动态性能视图,如`V$SESSION`和`V$SQL`,可以找到SQL语句的游标信息,然后使用`DBMS_XPLAN.DISPLAY_CURSOR`函数来显示对应的执行计划。这种方法可以获取到最新的执行计划信息。 3. 查询历史执行计划(DBMS_...

    Oracle运维最佳实践-下.pdf 带书签

    - 使用`DBMS_XPLAN.DISPLAY_CURSOR`显示执行计划,检查是否使用了索引。 - 使用`DBMS_STATS`重新收集索引统计信息,确保准确性。 - **2.1.24 Shared Pool优化和Library Cache Latch冲突优化** - Shared Pool是...

    为快捷显示Oracle执行计划创建存储过程

    4. **OPEN语句**:打开游标,查询`DBMS_XPLAN.DISPLAY()`函数返回的结果。`DBMS_XPLAN.DISPLAY()`是Oracle提供的一个包,用于展示执行计划的详细信息。 5. **LOOP-FETCH结构**:遍历游标中的每一行数据,通过`DBMS_...

    《Pro Oracle SQL》Chapter10 -- 10.2 Optimizing SQL -10.2.1Testing Execution Plans

    使用`DBMS_XPLAN.DISPLAY`或`DBMS_XPLAN.DISPLAY_CURSOR`函数,可以获取带有格式化的执行计划和额外的统计信息。 3. **执行计划的分析** - **操作符**:执行计划由一系列操作符组成,如TABLE ACCESS(表访问)、...

    读懂oracle sql执行计划

    最常用的方法包括使用EXPLAIN PLAN命令,SET AUTOTRACE ON命令和DBMS_XPLAN.DISPLAY函数。EXPLAIN PLAN命令将执行计划存入plan_table表中,然后通过查询这个表来查看执行计划。而SET AUTOTRACE ON命令则可以在执行...

    ORACLEEXPLAINPLAN的总结[文].pdf

    执行`EXPLAIN PLAN`后,可以通过查询`PLAN_TABLE`表或者使用`DBMS_XPLAN.DISPLAY`函数来查看执行计划。例如: ```sql SELECT A.OPERATION, OPTIONS, OBJECT_NAME, OBJECT_TYPE, ID, PARENT_ID FROM PLAN_TABLE a ...

    oracle优化文档

    例如,使用`EXPLAIN PLAN FOR`语句预解析SQL,然后用`SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY)`显示其详细信息。 执行计划中的关键指标包括: 1. **访问路径**:决定了数据如何从表或索引中获取。 2. **过滤条件**...

    Oracle sql文总结(case when,查看执行计画,文本操作,查看锁表及解锁,游标)

    SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); ``` 这可以帮助优化查询性能,了解数据库如何处理查询,包括使用的索引、连接方法等。 3. **文本操作**: Oracle提供了一系列函数来处理字符串,如`SUBSTR`用于提取...

    Oracle并行执行

    然后执行了一个对`emp2`表的并行查询,并使用`DBMS_XPLAN.DISPLAY()`函数展示了执行计划。执行计划显示了并行执行的不同阶段,包括并行协调器、并行发送、并行接收等操作,以及如何将表扫描操作并行化。 #### 九、...

    oracle执行计划建立与阅读

    然后通过`DBMS_XPLAN.DISPLAY`包中的函数来显示执行计划,如: ``` SQL&gt; @?/rdbms/admin/utlxpls 或 SQL&gt; select * from table(DBMS_XPLAN.DISPLAY); ``` 2. **使用AUTOTRACE** `AUTOTRACE`是一种自动分析和...

    Oracle执行计划介绍与测试.pdf

    - **使用`DBMS_XPLAN.DISPLAY()`函数**:通过调用Oracle提供的包`DBMS_XPLAN`中的`DISPLAY()`函数,可以格式化地展示执行计划。 - **直接查询`EXPLAIN_TABLE`**:通过`SELECT`语句直接查询`EXPLAIN_TABLE`,可以...

    planOracle

    另外,还可以使用DBMS_XPLAN包的函数来获取更详细的输出,包括执行计划的成本、行数估计和额外的执行计划选项。 "msnshow的个人空间 - 51Testing软件测试网"和"CSDN_NET"的博客文章可能会提供更具体的实例和技巧,...

    oracl unix 问题集

    5. 解释计划(Explain Plan)和执行计划的查看:通过DBMS_XPLAN.DISPLAY函数来查看SQL执行的详细计划,能够帮助数据库管理员分析并行操作的实际效果,如使用了多少CPU资源、处理的行数、执行的成本和时间等。...

    Oracle+面试及答案-经典.docx

    上述命令首先将执行计划存储到PLAN_TABLE中,然后通过`DBMS_XPLAN.DISPLAY`函数显示详细信息,包括访问路径、成本、行数估计等。 理解并熟练运用这些连接方式和执行计划分析是Oracle数据库管理员和开发人员的基本...

    oracle 数据库性能调优技术 3 中文

    通过先使用`explain plan for`命令,然后通过`DBMS_XPLAN.display`函数来查看具体的执行计划,可以避免实际执行查询所带来的资源消耗。 #### 四、示例演示 为了更好地理解上述概念,下面给出一个简单的示例: 1. ...

Global site tag (gtag.js) - Google Analytics