问题描述:关于oracle查看真实的执行计划,使用select * from table(dbms_xplan.display_cursor(null,null));的方式来获取执行计划

参考文档:https://blog.csdn.net/leshami/article/details/6866925

一、display_cursor描述

display_cursor用于显示SQL语句的真实的执行计划

DISPLAY_CURSOR语法

         DBMS_XPLAN.DISPLAY_CURSOR(
sql_id IN VARCHAR2 DEFAULT NULL,
child_number IN NUMBER DEFAULT NULL,
format IN VARCHAR2 DEFAULT 'TYPICAL');

display_cursor函数参数描述

        sql_id

                指定位于库缓存执行计划中SQL语句的父游标。默认值为null。当使用默认值时当前会话的最后一条SQL语句的执行计划将被返回可以通过查询V$SQL 或 V$SQLAREA的SQL_ID列来获得SQL语句的SQL_ID。

        child_number

                指定父游标下子游标的序号。即指定被返回执行计划的SQL语句的子游标。默认值为0。如果为null,则sql_id所指父游标下所有子游标的执行计划都将被返回。

        format

                控制SQL语句执行计划的输出部分,即哪些可以显示哪些不显示。使用与display函数的format参数与修饰符在这里同样适用。
除此之外当在开启statistics_level=all时或使用gather_plan_statistics提示可以获得执行计划中实时的统计信息
有关详细的format格式描述请参考:dbms_xplan之display函数的使用 中format参数的描述 下面给出启用统计信息时format新增的修饰符 iostats 控制I/O统计的显示
last 默认,显示所有执行计算过的统计。如果指定该值,则只显示最后一次执行的统计信息
memstats 控制pga相关统计的显示
allstats 此为iostats memstats的快捷方式,即allstats包含了iostats和memstats
run_stats_last 等同于iostats last。只能用于oracle 10g R1
run_stats_tot 等同于iostats。只能用于oracle 10g R1

二、使用scott用户演示使用display_cursor函数获取执行计划

1、当前数据库版本以及加载执行计划到库缓存

SQL> show user
USER is "SCOTT"
SQL> select * from v$version where rownum<2; BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production SQL>
SQL> SELECT ename,dname,loc
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND e.empno = 7788; 2 3 4 ENAME DNAME LOC
---------- -------------- -------------
SCOTT RESEARCH DALLAS

2、查看真实的执行计划,不传递任何参数给display_cursor函数,显示当前会话最后一条SQL语句的执行计划

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

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID a67wqmkfb9j65, child number 0
-------------------------------------
SELECT ename,dname,loc FROM emp e, dept d WHERE e.deptno = d.deptno
AND e.empno = 7788 Plan hash value: 2385808155 ----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
| 1 | NESTED LOOPS | | 1 | 54 | 2 (0)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 24 | 1 (0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 0 (0)| |
| 4 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 30 | 1 (0)| 00:00:01 |
|* 5 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| |
---------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 3 - access("E"."EMPNO"=7788)
5 - access("E"."DEPTNO"="D"."DEPTNO") 24 rows selected.

3.获得SQL语句的SQL_ID,可以看出此SQL_ID与上面显示的执行计划中的SQL_ID一致

SQL> select sql_id,address,plan_hash_value,hash_value,child_number from v$sql
where sql_text like '%SELECT ename%' and sql_text not like '%from v$sql%'; 2 SQL_ID ADDRESS PLAN_HASH_VALUE HASH_VALUE CHILD_NUMBER
------------- ---------------- --------------- ---------- ------------
a67wqmkfb9j65 0000000072C8C9D8 2385808155 2629092549 0

4.传递SQL_ID以及format参数,并配合修饰符控制执行计划的输出

/*--------------  ------------------------*/

SQL> select * from table(dbms_xplan.display_cursor('a67wqmkfb9j65',null,'typical -predicate -rows'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID a67wqmkfb9j65, child number 0
-------------------------------------
SELECT ename,dname,loc FROM emp e, dept d WHERE e.deptno = d.deptno
AND e.empno = 7788 Plan hash value: 2385808155 --------------------------------------------------------------------------------
| Id | Operation | Name | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | 2 (100)| |
| 1 | NESTED LOOPS | | 54 | 2 (0)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| EMP | 24 | 1 (0)| 00:00:01 |
| 3 | INDEX UNIQUE SCAN | PK_EMP | | 0 (0)| |
| 4 | TABLE ACCESS BY INDEX ROWID| DEPT | 30 | 1 (0)| 00:00:01 |
| 5 | INDEX UNIQUE SCAN | PK_DEPT | | 0 (0)| |
-------------------------------------------------------------------------------- 18 rows selected.

  

scott用户遇到的问题一:User has no SELECT privilege on V$SESSION

SQL> r
1* select * from table(dbms_xplan.display_cursor(null,null))

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
User has no SELECT privilege on V$SESSION

解决:

grant select on v_$sql to scott;
grant select on v_$sql_plan to scott;
grant select on v_$session to scott;
grant select on v_$sql_plan_statistics_all to scott;

问题二:cannot fetch plan for SQL_ID: 372mc93u1j1yk

SQL> r
1* select * from table(dbms_xplan.display_cursor(null,null))

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID 372mc93u1j1yk, child number 0

select * from table(dbms_xplan.display_cursor(null,null))

NOTE: cannot fetch plan for SQL_ID: 372mc93u1j1yk, CHILD_NUMBER: 0
Please verify value of SQL_ID and CHILD_NUMBER;
It could also be that the plan is no longer in cursor cache (check v$sql_p
lan)

解决:

SQL> set serveroutput off;
SQL> show serveroutput
serveroutput OFF

5.执行上述SQL语句后获得其真实的执行计划,使用了iostats last -predicate -note 修饰符控制显示输出

SQL> alter session set statistics_level=all;

Session altered.

SQL> select e.ename,e.sal,s.grade
from emp e
join salgrade s 2 3
on e.sal between losal and hisal
and e.deptno = 20; 4 5 ENAME SAL GRADE
---------- ---------- ----------
SMITH 800 1
JONES 2975 4
SCOTT 3000 4
ADAMS 1100 1
FORD 3000 4 SQL> select * from table(dbms_xplan.display_cursor(null,null,'iostats last -predicate -note'));
SQL_ID 243b0tpjxj6wv, child number 1
-------------------------------------
select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal
between losal and hisal and e.deptno = 20 Plan hash value: 4204027666 -------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 5 |00:00:00.01 | 13 |
| 1 | MERGE JOIN | | 1 | 1 | 5 |00:00:00.01 | 13 |
| 2 | SORT JOIN | | 1 | 5 | 5 |00:00:00.01 | 6 |
| 3 | TABLE ACCESS FULL | EMP | 1 | 5 | 5 |00:00:00.01 | 6 |
| 4 | FILTER | | 5 | | 5 |00:00:00.01 | 7 |
| 5 | SORT JOIN | | 5 | 5 | 14 |00:00:00.01 | 7 |
| 6 | TABLE ACCESS FULL| SALGRADE | 1 | 5 | 5 |00:00:00.01 | 7 |
------------------------------------------------------------------------------------------- 19 rows selected.

6.修改会话级别的参数statistics_level为typical并验证修改结果,scott用户无v$parameter权限可以用sys

SQL> col name format a40
col value format a25
col display_value format aSQL> SQL> 25
select name, value, display_value, isses_modifiable
from v$parameter SQL> 2
where isses_modifiable = 'TRUE'
and name like '%&input_name%'; 3 4
Enter value for input_name: statistics_level
old 4: and name like '%&input_name%'
new 4: and name like '%statistics_level%' NAME VALUE DISPLAY_VALUE ISSES
---------------------------------------- ------------------------- ------------------------- -----
statistics_level TYPICAL TYPICAL TRUE

7.使用提示gather_plan_statistics,并获得其真实执行计划,使用了allstats -rows修饰符控制显示输出

SQL> set pagesize 180
SELECT /*+ gather_plan_statistics */ ename,dname,loc
FROM emp e, dept d SQL> 2
WHERE e.deptno = d.deptno
AND d.deptno=20 ORDER BY 1,2,3; 3 4 ENAME DNAME LOC
---------- -------------- -------------
ADAMS RESEARCH DALLAS
FORD RESEARCH DALLAS
JONES RESEARCH DALLAS
SCOTT RESEARCH DALLAS
SMITH RESEARCH DALLAS SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats -rows')); PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID d2hh42yzqqjz7, child number 0
-------------------------------------
SELECT /*+ gather_plan_statistics */ ename,dname,loc FROM emp e, dept
d WHERE e.deptno = d.deptno AND d.deptno=20 ORDER BY 1,2,3 Plan hash value: 3339094711 ---------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | A-Rows | A-Time | Buffers | OMem | 1Mem | O/1/M |
---------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5 |00:00:00.01 | 8 | | | |
| 1 | SORT ORDER BY | | 1 | 5 |00:00:00.01 | 8 | 2048 | 2048 | 1/0/0|
| 2 | NESTED LOOPS | | 1 | 5 |00:00:00.01 | 8 | | | |
| 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 1 |00:00:00.01 | 2 | | | |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | 1 |00:00:00.01 | 1 | | | |
|* 5 | TABLE ACCESS FULL | EMP | 1 | 5 |00:00:00.01 | 6 | | | |
--------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 4 - access("D"."DEPTNO"=20)
5 - filter("E"."DEPTNO"=20) 24 rows selected.

  

执行计划display_cursor函数的更多相关文章

  1. 通过dbms_xplan.display_cursor识别低效的执行计划

    dbms_xplan.display_cursor定义: function display_cursor(sql_id           varchar2 default  null,        ...

  2. dbms_xplan的display_cursor查看执行计划

    准备工作: SQL> conn sys/root as sysdba Connected. SQL> grant select on v_$sql_plan to scott; Grant ...

  3. 关于T-SQL重编译那点事,内联函数和表值函数在编译生成执行计划的区别

    本文出处:http://www.cnblogs.com/wy123/p/6266724.html 最近在学习 WITH RECOMPILE和OPTION(RECOMPILE)在重编译上的区别的时候,无 ...

  4. 巧用DISPLAY_AWR函数与dba_hist_sqlstat结合查询SQL语句在指定节点指定时间范围内的历史执行计划

    1.问题        通过调用dbms_xplan包中DISPLAY_AWR函数(DBMS_XPLAN.DISPLAY_AWR)可以从AWR数据中查看到SQL语句的历史执行计划,但是,DISPLAY ...

  5. 学习如何看懂SQL Server执行计划(二)——函数计算篇

    二.函数计算部分 --------------------标量聚合--------------------/* 标量聚合-主要在聚合函数操作中产生 计算标量:根据行中的现有值计算出一个新值 流聚合:在 ...

  6. MySQL— 索引,视图,触发器,函数,存储过程,执行计划,慢日志,分页性能

    一.索引,分页性能,执行计划,慢日志 (1)索引的种类,创建语句,名词补充(最左前缀匹配,覆盖索引,索引合并,局部索引等): import sys # http://www.cnblogs.com/w ...

  7. Mysql学习---视图/触发器/存储过程/函数/执行计划/sql优化 180101

    视图 视图: 视图是一个虚拟表(非真实存在),动态获取数据,仅仅能做查询操作 本质:[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用.由 ...

  8. 案例:使用dbms_xplan.display_cursor无法获取执行计划

    案例:使用dbms_xplan.display_cursor无法获取执行计划 环境:RHEL 6.5 + Oracle 11.2.0.4 在一次测试中发现使用dbms_xplan.display_cu ...

  9. 【Hive】概念、安装、数据类型、DDL、DML操作、查询操作、函数、压缩存储、分区分桶、实战Top-N、调优(fetch抓取)、执行计划

    一.概念 1.介绍 基于Hadoop的数据仓库工具,将结构化数据映射为一张表,可以通过类SQL方式查询 本质:将HQL转换成MapReduce程序 Hive中具有HQL对应的MapReduce模板 存 ...

  10. 查看ORACLE的实际执行计划

    ORACLE的执行计划分为预估执行计划和实际执行计划.其中,你用Toad.PL/SQL Developer.SQL Developer.EXPLAIN PLAN FOR或者SET ATUOTRACE ...

随机推荐

  1. 如何在VM虚拟机里建立Linux操作系统

    1.新建虚拟机 2.选择典型安装 3.选择稍后安装操作系统 4.选择Linux操作系统和CentOS 7 64位 5.选择文件路径 注意:建议每台虚拟机单独文件夹保存,并且此处路径最好不要有中文出现 ...

  2. CSS 常用样式-文字三属性

    颜色 color: 作用:给文字设置颜色. 属性名 k :color 属性值 v :颜色名.颜色值. 颜色名: 颜色名就是使用颜色的英文单词进行表示. 需要记忆一些最常用的颜色名: 更多的颜色名可以通 ...

  3. Linux习题

    1.判断/etc/inittab文件是否大于100行,如果大于,则显示"/etc/inittab is a big file."否者显示"/etc/inittab is ...

  4. 小白开始成长了+洛谷1488与CF629A Far Relative’s Birthday Cake题解

    终于开始我的博客生活了,希望博客可以让我记住学了什么,错了什么,接下来会有什么将出现. 记录写ACM生涯中的一些经验和网工经验吧,如果有人看我博客的话,希望可以留言给我提提意见,指导指导我啦~~~ 正 ...

  5. SQL Server获取连接的IP地址

    来源:http://www.itpub.net/thread-193247-1-1.html 先保存,以后研究一下 1 *--获取连接SQL服务器的信息 2 3 所有连接本机的:操作的数据库名,计算机 ...

  6. 6.Vue路由

    一.路由的基本概念与原理 路由是一个广义与抽象的概念,路由的本质就是对应关系 在开发中,路由分为: (1) 后端路由 (2) 前端路由 1.1 路由 1. 后端路由(根据不同的URL地址分发不同的资源 ...

  7. C# 动态操作 控件位置绑定 [ Anchor ] 属性

    注: 1.此类属于非常用类,只因本人需要编写的...顺便刷贴一下 2.对于初学,其中的枚举使用可以为你加深一点印象 以下为操作类代码: public class AchCtrer { #region ...

  8. oneDNN

    目录 oneDNN卷积思路 debug捆绑套路 jit_avx2_convolution_fwd_t::execute_forward( 整个文件oneDNN/src/cpu/x64/jit_avx2 ...

  9. 【帆吖】Java学习零基础21

    数组 1 package array; 2 3 public class Demo1 { 4 public static void main(String[] args) { 5 int[ ] num ...

  10. 使用python来搭建一个简易的文件下载环境以及用droopy来实现一个文件上传环境

    ubuntu在安装的时候一般都是自带python环境的,大家可以查看一下查看demo如下 用于共享的命令很简单python2: python -m SimpleHTTPServer 8888pytho ...