dbms_xplan.display_cursor

执行查询前先改下参数:

SQL> show parameter level

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
plsql_optimize_level                 integer     2
statistics_level                     string      TYPICAL
SQL> alter session set statistics_level = all;

会话已更改。


执行示例如下,以下模拟你执行过的语句

SQL> BEGIN
  2    FOR cur IN (SELECT deptno FROM dept) LOOP
  3      EXECUTE IMMEDIATE 'select /*1234*/ /*+ GATHER_PLAN_STATISTICS*/ * from emp where deptno = :deptno'
  4        USING cur.deptno;
  5    END LOOP;
  6  END;
  7  /
PL/SQL procedure successfully completed


找到对应的sql_id

SQL> SELECT v.SQL_ID,v.SQL_TEXT FROM v$sql v WHERE v.SQL_TEXT LIKE '%1234%';
SQL_ID        SQL_TEXT
------------- --------------------------------------------------------------------------------
7tjhpj1f4sb46 BEGIN   FOR cur IN (SELECT deptno FROM dept) LOOP     EXECUTE IMMEDIATE 'select
8cytzt7wnu03n select /*1234*/ /*+ GATHER_PLAN_STATISTICS*/ * from emp where deptno = :deptno
36k4hdz29mf45 SELECT v.SQL_ID,v.SQL_TEXT FROM v$sql v WHERE v.SQL_TEXT LIKE '%1234%'
这儿明显是8cytzt7wnu03n,然后查看对应的plan

SQL> select * from table(dbms_xplan.display_cursor(sql_id =>'8cytzt7wnu03n',cursor_child_no =>0,format =>'ALL ALLSTATS LAST NOTE ADVANCED -projection'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  8cytzt7wnu03n, child number 0
-------------------------------------
select /*1234*/ /*+ GATHER_PLAN_STATISTICS*/ * from emp where deptno =
:deptno
Plan hash value: 1223387170
--------------------------------------------------------------------------------
| Id  | Operation                   | Name             | Starts | E-Rows |E-Byte
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                  |      1 |        |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMP              |      1 |      3 |   147
|*  2 |   INDEX RANGE SCAN          | IDX_DEPTNO_ENAME |      1 |      3 |
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1 / EMP@SEL$1
   2 - SEL$1 / EMP@SEL$1
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Outline Data
-------------
  /*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('11.2.0.1')
      DB_VERSION('11.2.0.1')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      INDEX_RS_ASC(@"SEL$1" "EMP"@"SEL$1" ("EMP"."DEPTNO" "EMP"."ENAME"))
      END_OUTLINE_DATA
  */
Peeked Binds (identified by position):
--------------------------------------
   1 - (NUMBER): 10
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------
   2 - access("DEPTNO"=:DEPTNO)
45 rows selected


也可以在sqlplus下面对刚刚执行过的sql查看plan

首先设置如下

连接到: 
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> set linesize 200 pagesize 200
SQL> show parameter level;

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
plsql_optimize_level		     integer	 2
statistics_level		     string	 TYPICAL
SQL> alter session set statistics_level=all
  2  /

会话已更改。

然后执行sql

SQL> select * from emp inner join dept on dept.deptno = emp.deptno;

     EMPNO ENAME      JOB	       MGR HIREDATE		 SAL	   COMM     DEPTNO DNAME						      SN     DEPTNO DNAME	   LOC
---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- -------------------------------------------------- ---------- ---------- -------------- -------------
      7782 CLARK      MANAGER	      7839 09-6月 -81		2450			10 UNKNOWN						       7	 10 ACCOUNTING	   NEW YORK
      7839 KING       PRESIDENT 	   17-11月-81		5000			10 UNKNOWN						       9	 10 ACCOUNTING	   NEW YORK
      7934 MILLER     CLERK	      7782 23-1月 -82		1300			10 UNKNOWN						      14	 10 ACCOUNTING	   NEW YORK
      7566 JONES      MANAGER	      7839 02-4月 -81		2975			20 RESEARCH						       4	 20 RESEARCH	   DALLAS
      7902 FORD       ANALYST	      7566 03-12月-81		3000			20 RESEARCH						      13	 20 RESEARCH	   DALLAS
      7876 ADAMS      CLERK	      7788 23-5月 -87		1100			20 RESEARCH						      11	 20 RESEARCH	   DALLAS
      7369 SMITH      CLERK	      7902 17-12月-80		 800			20 RESEARCH						       1	 20 RESEARCH	   DALLAS
      7788 SCOTT      ANALYST	      7566 19-4月 -87		3000			20 RESEARCH						       8	 20 RESEARCH	   DALLAS
      7521 WARD       SALESMAN	      7698 22-2月 -81		1250	    500 	30 SALES						       3	 30 SALES	   CHICAGO
      7844 TURNER     SALESMAN	      7698 08-9月 -81		1500	      0 	30 SALES						      10	 30 SALES	   CHICAGO
      7499 ALLEN      SALESMAN	      7698 20-2月 -81		1600	    300 	30 SALES						       2	 30 SALES	   CHICAGO
      7900 JAMES      CLERK	      7698 03-12月-81		 950			30 SALES						      12	 30 SALES	   CHICAGO
      7698 BLAKE      MANAGER	      7839 01-5月 -81		2850			30 SALES						       6	 30 SALES	   CHICAGO
      7654 MARTIN     SALESMAN	      7698 28-9月 -81		1250	   1400 	30 SALES						       5	 30 SALES	   CHICAGO

已选择14行。
ok,我们可以直接用display_cursor看plan了。

语句为

select * from table(dbms_xplan.display_cursor(sql_id =>NULL,cursor_child_no =>0,format =>'ALL ALLSTATS LAST NOTE ADVANCED -projection'));

SQL> select * from table(dbms_xplan.display_cursor(sql_id =>NULL,cursor_child_no =>0,format =>'ALL ALLSTATS LAST NOTE ADVANCED -projection'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID	91r8jh6q152tc, child number 0
-------------------------------------
select * from emp inner join dept on dept.deptno = emp.deptno

Plan hash value: 844388907

----------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation		     | Name    | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time	 | A-Rows |   A-Time   | Buffers | Reads  |  OMem |  1Mem | Used-Mem |
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT	     |	       |      1 |	 |	 |     6 (100)| 	 |     14 |00:00:00.02 |       7 |	2 |	  |	  |	     |
|   1 |  MERGE JOIN		     |	       |      1 |     14 |   966 |     6  (17)| 00:00:01 |     14 |00:00:00.02 |       7 |	2 |	  |	  |	     |
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |      1 |      4 |    80 |     2   (0)| 00:00:01 |	4 |00:00:00.02 |       4 |	2 |	  |	  |	     |
|   3 |    INDEX FULL SCAN	     | PK_DEPT |      1 |      4 |	 |     1   (0)| 00:00:01 |	4 |00:00:00.01 |       2 |	1 |	  |	  |	     |
|*  4 |   SORT JOIN		     |	       |      4 |     14 |   686 |     4  (25)| 00:00:01 |     14 |00:00:00.01 |       3 |	0 |  2048 |  2048 | 2048  (0)|
|   5 |    TABLE ACCESS FULL	     | EMP     |      1 |     14 |   686 |     3   (0)| 00:00:01 |     14 |00:00:00.01 |       3 |	0 |	  |	  |	     |
----------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

   1 - SEL$58A6D7F6
   2 - SEL$58A6D7F6 / DEPT@SEL$1
   3 - SEL$58A6D7F6 / DEPT@SEL$1
   5 - SEL$58A6D7F6 / EMP@SEL$1

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

  /*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('11.2.0.1')
      DB_VERSION('11.2.0.1')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$58A6D7F6")
      MERGE(@"SEL$1")
      OUTLINE(@"SEL$2")
      OUTLINE(@"SEL$1")
      INDEX(@"SEL$58A6D7F6" "DEPT"@"SEL$1" ("DEPT"."DEPTNO"))
      FULL(@"SEL$58A6D7F6" "EMP"@"SEL$1")
      LEADING(@"SEL$58A6D7F6" "DEPT"@"SEL$1" "EMP"@"SEL$1")
      USE_MERGE(@"SEL$58A6D7F6" "EMP"@"SEL$1")
      END_OUTLINE_DATA
  */

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

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


已选择51行。

SQL> 


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的显示

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值