oracle查看执行计划之DBMS_XPLAN

使用DBMS_XPLAN包中的方法是在oracle数据库中得到目标SQL的执行计划的另一种方法。针对不同的应用场景吗,你可以选择如下四种方法中的一种:

select * from table(dbms_xplan.display)

select * from table(dbms_xplan.display_cursor(null,null,‘advenced‘));

select * from table(dbms_xplan.display_cursor(‘sql_id/hash_value‘,child_cursor_number,‘advanced‘));

select * from table(dbms_xplan.display_awr(‘sql_id‘));

方法1是执行select * from table(dbms_xplan.display),这需要与explain plan命令配合使用,它用于查看使用explain plan命令后得到的执行计划。

方法2是执行select * from table(dbms_xplan.display_cursor(null,null,‘advenced‘));它用于查看刚刚执行过的sql的执行计划,这里针对dbms_xplan.display_cursor所传入的第一个和第二参数的值均为null,第三参数的值是“advanced”,第三个输入参数的值也可以是“all”,只不过用“advanced”后的显示结果会比用“all”的显示结果更详细些。

SQL> conn scott/scott;

Connected.

SQL> set linesize 800

SQL> set pagesize 900

SQL> col plan_table_output for a200

SQL> select empno,ename,dname from emp,dept where emp.deptno=dept.deptno;

EMPNO ENAME      DNAME

---------- ---------- --------------

7782 CLARK      ACCOUNTING

7839 KING       ACCOUNTING14 rows selected.

SQL> select * from table(dbms_xplan.display_cursor(null,null,‘advanced‘));

PLAN_TABLE_OUTPUT

-------------------------------------------------------------------------------------------

SQL_ID 7ww0fhpbqqt0n, child number 0

-------------------------------------

select empno,ename,dname from emp,dept where emp.deptno=dept.deptno

Plan hash value: 844388907

----------------------------------------------------------------------------------------

| Id  | Operation     | Name    | Rows  | Bytes | Cost (%CPU)| Time     |

----------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT     |       |       |       |     6 (100)|       |

|   1 |  MERGE JOIN     |       |    14 |   364 |     6 (17)| 00:00:01 |

|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     4 |    52 |     2 (0)| 00:00:01 |

|   3 |    INDEX FULL SCAN     | PK_DEPT |     4 |       |     1 (0)| 00:00:01 |

|*  4 |   SORT JOIN     |       |    14 |   182 |     4 (25)| 00:00:01 |

|   5 |    TABLE ACCESS FULL     | EMP     |    14 |   182 |     3 (0)| 00:00:01 |

----------------------------------------------------------------------------------------

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

-------------------------------------------------------------

1 - SEL$1

2 - SEL$1 / [email protected]$1

3 - SEL$1 / [email protected]$1

5 - SEL$1 / [email protected]$1

Outline Data

-------------

/*+

BEGIN_OUTLINE_DATA

IGNORE_OPTIM_EMBEDDED_HINTS

OPTIMIZER_FEATURES_ENABLE(‘11.2.0.4‘)

DB_VERSION(‘11.2.0.4‘)

ALL_ROWS

OUTLINE_LEAF(@"SEL$1")

INDEX(@"SEL$1" "DEPT"@"SEL$1" ("DEPT"."DEPTNO"))

FULL(@"SEL$1" "EMP"@"SEL$1")

LEADING(@"SEL$1" "DEPT"@"SEL$1" "EMP"@"SEL$1")

USE_MERGE(@"SEL$1" "EMP"@"SEL$1")

END_OUTLINE_DATA

*/

Predicate Information (identified by operation id):

---------------------------------------------------

4 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")

filter("EMP"."DEPTNO"="DEPT"."DEPTNO")

Column Projection Information (identified by operation id):

-----------------------------------------------------------

1 - "DNAME"[VARCHAR2,14], "EMPNO"[NUMBER,22], "ENAME"[VARCHAR2,10]

2 - "DEPT"."DEPTNO"[NUMBER,22], "DNAME"[VARCHAR2,14]

3 - "DEPT".ROWID[ROWID,10], "DEPT"."DEPTNO"[NUMBER,22]

4 - (#keys=1) "EMP"."DEPTNO"[NUMBER,22], "EMPNO"[NUMBER,22],

"ENAME"[VARCHAR2,10]

5 - "EMPNO"[NUMBER,22], "ENAME"[VARCHAR2,10], "EMP"."DEPTNO"[NUMBER,22]

58 rows selected.

SQL> select * from table(dbms_xplan.display_cursor(null,null,‘all‘));

PLAN_TABLE_OUTPUT

-------------------------------------------------------------------------------------------

SQL_ID 7ww0fhpbqqt0n, child number 0

-------------------------------------

select empno,ename,dname from emp,dept where emp.deptno=dept.deptno

Plan hash value: 844388907

----------------------------------------------------------------------------------------

| Id  | Operation     | Name    | Rows  | Bytes | Cost (%CPU)| Time     |

----------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT     |       |       |       |     6 (100)|       |

|   1 |  MERGE JOIN     |       |    14 |   364 |     6 (17)| 00:00:01 |

|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     4 |    52 |     2 (0)| 00:00:01 |

|   3 |    INDEX FULL SCAN     | PK_DEPT |     4 |       |     1 (0)| 00:00:01 |

|*  4 |   SORT JOIN     |       |    14 |   182 |     4 (25)| 00:00:01 |

|   5 |    TABLE ACCESS FULL     | EMP     |    14 |   182 |     3 (0)| 00:00:01 |

----------------------------------------------------------------------------------------

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

-------------------------------------------------------------

1 - SEL$1

2 - SEL$1 / [email protected]$1

3 - SEL$1 / [email protected]$1

5 - SEL$1 / [email protected]$1

Predicate Information (identified by operation id):

---------------------------------------------------

4 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")

filter("EMP"."DEPTNO"="DEPT"."DEPTNO")

Column Projection Information (identified by operation id):

-----------------------------------------------------------

1 - "DNAME"[VARCHAR2,14], "EMPNO"[NUMBER,22], "ENAME"[VARCHAR2,10]

2 - "DEPT"."DEPTNO"[NUMBER,22], "DNAME"[VARCHAR2,14]

3 - "DEPT".ROWID[ROWID,10], "DEPT"."DEPTNO"[NUMBER,22]

4 - (#keys=1) "EMP"."DEPTNO"[NUMBER,22], "EMPNO"[NUMBER,22],

"ENAME"[VARCHAR2,10]

5 - "EMPNO"[NUMBER,22], "ENAME"[VARCHAR2,10], "EMP"."DEPTNO"[NUMBER,22]

41 rows selected.

当参数传入all,显示结果中了“Qutline Data”部分的内容:

方法3是执行    select * from table(dbms_xplan.display_cursor(‘sql_id/hash_value‘,child_cursor_number,‘advanced‘));它用于查看指定sql的执行计划。这里针对方法dbms_xplan.display_cursor所传人的第一个参数的值是指定sql的sql_id或者sql hash value,第二参数的值是要看执行计划所在的child cursor number,第三个参数是advcanced或者all

SQL> select sql_text,sql_id,hash_value,child_number from v$sql where sql_text like ‘select empno,ename,dname%‘;

SQL_TEXT

select empno,ename,dname from emp,dept where emp.deptno=dept.deptno

SQL_ID      HASH_VALUE CHILD_NUMBER

------------- ---------- ------------

7ww0fhpbqqt0n 1466655764    0

只要目标sql的执行计划所在的child cursor还没有被page out出shared pool,就可以使用方法3查看该sql的执行计划:

SQL> select * from table(dbms_xplan.display_cursor(‘2qm0f3qgsqqyc‘,0,‘advanced‘));

PLAN_TABLE_OUTPUT

-------------------------------------------------------------------------------------------

SQL_ID 2qm0f3qgsqqyc, child number 0

-------------------------------------

select empno,ename,dname from scott.emp,scott.dept where

scott.emp.deptno=scott.dept.deptno

Plan hash value: 844388907

----------------------------------------------------------------------------------------

| Id  | Operation     | Name    | Rows  | Bytes | Cost (%CPU)| Time     |

----------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT     |       |       |       |     6 (100)|       |

|   1 |  MERGE JOIN     |       |    14 |   364 |     6 (17)| 00:00:01 |

|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     4 |    52 |     2 (0)| 00:00:01 |

|   3 |    INDEX FULL SCAN     | PK_DEPT |     4 |       |     1 (0)| 00:00:01 |

|*  4 |   SORT JOIN     |       |    14 |   182 |     4 (25)| 00:00:01 |

|   5 |    TABLE ACCESS FULL     | EMP     |    14 |   182 |     3 (0)| 00:00:01 |

----------------------------------------------------------------------------------------

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

-------------------------------------------------------------

1 - SEL$1

2 - SEL$1 / [email protected]$1

3 - SEL$1 / [email protected]$1

5 - SEL$1 / [email protected]$1

Outline Data

-------------

/*+

BEGIN_OUTLINE_DATA

IGNORE_OPTIM_EMBEDDED_HINTS

OPTIMIZER_FEATURES_ENABLE(‘11.2.0.4‘)

DB_VERSION(‘11.2.0.4‘)

ALL_ROWS

OUTLINE_LEAF(@"SEL$1")

INDEX(@"SEL$1" "DEPT"@"SEL$1" ("DEPT"."DEPTNO"))

FULL(@"SEL$1" "EMP"@"SEL$1")

LEADING(@"SEL$1" "DEPT"@"SEL$1" "EMP"@"SEL$1")

USE_MERGE(@"SEL$1" "EMP"@"SEL$1")

END_OUTLINE_DATA

*/

Predicate Information (identified by operation id):

---------------------------------------------------

4 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")

filter("EMP"."DEPTNO"="DEPT"."DEPTNO")

Column Projection Information (identified by operation id):

-----------------------------------------------------------

1 - "DNAME"[VARCHAR2,14], "EMPNO"[NUMBER,22], "ENAME"[VARCHAR2,10]

2 - "DEPT"."DEPTNO"[NUMBER,22], "DNAME"[VARCHAR2,14]

3 - "DEPT".ROWID[ROWID,10], "DEPT"."DEPTNO"[NUMBER,22]

4 - (#keys=1) "EMP"."DEPTNO"[NUMBER,22], "EMPNO"[NUMBER,22],

"ENAME"[VARCHAR2,10]

5 - "EMPNO"[NUMBER,22], "ENAME"[VARCHAR2,10], "EMP"."DEPTNO"[NUMBER,22]

59 rows selected.

我们可以通过dbms_xplan.display_awr来得到该sql的所有历史执行计划:

SQL> set lines 100

SQL> select * from table(dbms_xplan.display_awr(‘cy097a90nu4fk‘));

PLAN_TABLE_OUTPUT

SQL_ID cy097a90nu4fk

--------------------

Plan hash value: 1999179007

-------------------------------------------------------------------------------------------

| Id  | Operation                        | Name           | Rows  | Bytes | Cost (%CPU)| Time     |

Inst   |IN-OUT|

-------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                 |                |       |       |    11 (100)|          |

|      |

|   1 |  HASH GROUP BY                   |                |     1 |   101 |    11  (19)| 00:00:01 |

|      |

|   2 |   VIEW                           |                |     1 |   101 |    10  (10)| 00:00:01 |

|      |

|   3 |    HASH GROUP BY                 |                |     1 |   261 |    10  (10)| 00:00:01 |

|      |

|   4 |     FILTER                       |                |       |       |            |          |

|      |

|   5 |      NESTED LOOPS                |                |       |       |            |          |

|      |

|   6 |       NESTED LOOPS               |                |     1 |   261 |     9   (0)| 00:00:01 |

|      |

|   7 |        REMOTE                    |                |     1 |   176 |     5   (0)| 00:00:01 |

DBLK_~ | R->S |

|   8 |        INDEX RANGE SCAN          | PRODUCTSPEC_PK |     1 |       |     1   (0)| 00:00:01 |

|      |

|   9 |       TABLE ACCESS BY INDEX ROWID| PRODUCTSPEC    |     1 |    41 |     2   (0)| 00:00:01 |

|      |

-------------------------------------------------------------------------------------------

Remote SQL Information (identified by operation id):

----------------------------------------------------

7 - SELECT "A1"."EVENTTIMEKEY","A1"."EVENTID","A1"."EVENTTIME","A1"."FOLLOTID","A1"."PRODUCTSPECI

D","A1"

."PROCESSFLOWID","A1"."OLDOPERATIONID","A1"."QUANTITY","A1"."EQUIPMENTID","A2"."PROCESSFLOWID

","A2"."REWORK

TYPE" FROM "LOTHISTORY" "A1","PROCESSFLOW" "A2" WHERE "A2"."REWORKTYPE"=‘Normal‘ AND

"A1"."PROCESSFLOWID"="A2"."PROCESSFLOWID" AND "A1"."EVENTID"=‘TrackIn‘ AND "A1"."OLDOPERATION

ID"=‘BFOP001‘

AND (SUBSTR("A1"."FOLLOTID",1,1)=‘V‘ OR SUBSTR("A1"."FOLLOTID",1,1)=‘P‘) AND

"A1"."EVENTTIME">=TO_DATE(‘20140918080001‘,‘YYYY-MM-DD HH24:MI:SS‘) AND

"A1"."EVENTTIME"<=TO_DATE(‘20140919080000‘,‘YYYY-MM-DD HH24:MI:SS‘) (accessing ‘DBLK_RPT_EOL_

PRD‘ )

55 rows selected.

不过此方法显示执行计划中看不到执行步骤对应的谓词条件。

时间: 2024-10-06 13:10:00

oracle查看执行计划之DBMS_XPLAN的相关文章

Oracle 查看执行计划问题

一.描述在查看执行计划测试的过程中遇到使用dbms_xplan.display无法查看执行计划,发现是因为之前在测试的过程中打开了set autot on,关闭后(set autot off) ,执行计划可以正常显示. 二.操作过程 SQL> SQL> explain plan for select count(*) from tt; Explained. Elapsed: 00:00:00.00 SQL> set lines 200 pages 2000 SQL> select

oracle查看执行计划入门

基于Oracle的应用系统很多的性能问题都是由应用系统的SQL性能低劣引起的,因此SQL的性能优化非常重要.要分析与优化SQL的性能,一般是通过查看该SQL的执行计划,然后通过执行计划有针对性地对SQL进行相应的优化. 什么是执行计划(Explain Plan) 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述. SQL是一门傻瓜式语言,每一个条件就是一个需求,访问的顺序不同就形成了不同的执行计划.Oracle必须要做出选择,一次只能有一种访问路径,也就是一次只能有一个执行计划.

oracle查看执行计划

方法一: SQL> explain plan for select name from a,b where a.id=b.id; 已解释. SQL> select * from table(DBMS_XPLAN.DISPLAY); 方法二: SQL> set autotrace on explain;    //打开执行计划 SQL> select name from a,b where a.id=b.id; 查看结束后,记得关闭执行计划 SQL> set autotrace

Oracle数据库查看执行计划

基于ORACLE的应用系统很多性能问题,是由应用系统SQL性能低劣引起的,所以,SQL的性能优化很重要,分析与优化SQL的性能我们一般通过查看该SQL的执行计划,本文就如何看懂执行计划,以及如何通过分析执行计划对SQL进行优化做相应说明. 一.什么是执行计划(explain plan) 执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述. 二.如何查看执行计划 1: 在PL/SQL下按F5查看执行计划.第三方工具toad等. 很多人以为PL/SQL的执行计划只能看到基数.优化器.耗

oracle如何查看执行计划

1.在PL/SQL Developer中得到一个SQL的执行计划 输入想要查看执行计划的目标SQL,再按一下快捷键F5就可以了.2.explain plan 命令 explain plan for + 目标SQL select * from table(dbms_xplan.display)3. DBMS_XPLAN 包 1) select * from table(dbms_xplan.display_cursor(null,null,'advanced')) 它用于在SQLPLUS中查看刚刚

数据库-Oracle通过执行计划查看查询语句是否使用索引【转】

1.生成执行计划 explain plan for select * from t_call_records where t_bjhm='123456' 备注:explain plan for后面为要生成执行计划的查询语句 2.查看执行计划结果 select * from table(dbms_xplan.display) 如上图所示,TABLE ACCESS FULL为全表扫描; 为t_bjhm列加上索引后生成执行计划并查看结果: 如上图所示,index range scan为索引范围扫描;

DBMS_XPLAN Package来查看执行计划

查看执行计划除了AUTOTRACE的方法外,还可以使用DBMS_XPLAN Package来查看 1.执行"explain Plan"语法:SQL> Explain plan forTry this command:SQL> explain plan for select * from mtl_system_items_b where inventory_item_id = 149 and organization_id = 207;Explained这个命令会产生执行计划

Oracle SQL执行计划基线总结(SQL Plan Baseline)

一.基础概念 Oracle 11g开始,提供了一种新的固定执行计划的方法,即SQL plan baseline,中文名SQL执行计划基线(简称基线),可以认为是OUTLINE(大纲)或者SQL PROFILE的改进版本,基本上它的主要作用可以归纳为如下两个: 1.稳定给定SQL语句的执行计划,防止执行环境或对象统计信息等等因子的改变对SQL语句的执行计划产生影响! 2.减少数据库中出现SQL语句性能退化的概率,理论上不允许一条语句切换到一个比已经执行过的执行计划慢很多的新的执行计划上! 注意:

分析oracle的执行计划(explain plan)并对对sql进行优化实践

基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分析执行计划对sql进行优化做相应说明. 一.什么是执行计划(explain plan) 执行计划:一条查询语句在oracle中的执行过程或访问路径的描述. 二.如何查看执行计划 1.set autotrace on 2.explain plan for sql语句; select plan_tabl