Oracle-SQL Explain Plan解读

简介: Oracle-SQL Explain Plan解读

概述


执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。


基于ORACLE的应用系统很多性能问题,是由应用系统SQL性能低劣引起的,所以,SQL的性能优化很重要,分析与优化SQL的性能我们一般通过查看该SQL的执行计划。


常用方法


1.Explain Plan For SQL

•不要实际执行SQL语句,生成的计划未必是真实执行的计划

•必须要有plan_table


2.SQLPLUS AUTOTRACE

•除set autotrace traceonly explain外均实际执行SQL,但仍未必是真实计划

•必须要有plan_table


3.SQL TRACE

•需要启用10046或者SQL_TRACE

•一般用tkprof看的更清楚些,当然10046里本身也有执行计划信息


4.V$SQL和V$SQL_PLAN

•可以查询到多个子游标的计划信息了,但是看起来比较费劲

5.Enterprise Manager

•可以图形化显示执行计划,但并非所有环境有EM可用


6.其他第三方工具

•注意 PL/SQL developer之类工具F5看到的执行计划未必是真实的


以上大部分都未必是真实的SQL 执行计划,了解即可。


最靠谱的方法-Display_cursor

DBMS_XPLAN包概述


DBMS_XPLAN这个包最初是在ORACLE 9i R2中引入的,用来查看Explain Plan生成的执行计划。DBMS_XPLAN 在ORACLE 10g 以及ORACLE 11g中,功能都有所增长。


官方文档


https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_xplan.htm#CACFJGHG


http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_xplan.htm#CACFJGHG


10g和11g的函数说明


在ORACLE 10g提供了下面4个函数的功能:



aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYxMTMwMjAwNTE2Mjgw.png

在ORACLE 11g提供了下面5个函数的功能:

相比10g增加了 DISPLAY_SQL_PLAN_BASELINE


DISPLAY_SQL_PLAN_BASELINE - to display one or more execution plans for the SQL statement identified by SQL handle


display_cursor的定义


我们可以在dbms_xplan这个包中看到 display_cursor的定义如下:


aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYxMTMwMjAwOTIyMzEx.png

入参说明:


sql_id:


指定位于库缓存执行计划中SQL语句的父游标。默认值为null。


当使用默认值时当前会话的最后一条SQL语句的执行计划将被返回


可以通过查询V$SQL 或 V$SQLAREA的SQL_ID列来获得SQL语句的SQL_ID。


cursor_child_no:


指定父游标下子游标的序号。即指定被返回执行计划的SQL语句的子游标。默认值为0。


如果为null,则sql_id所指父游标下所有子游标的执行计划都将被返回。


format:


控制SQL语句执行计划的输出部分,即哪些可以显示哪些不显示。使用与display函数的format参数与修饰符在这里同样适用。


除此之外当在开启statistics_level=all时或使用gather_plan_statistics提示可以获得执行计划中实时的统计信息。


TYPICAL:这个是默认值,显示执行计划中大部分信息(operation id, name and option, #rows, #bytes and optimizer cost),并行、谓词信息等, 除了别名,提纲和字段投影外。


还有


BASIC:仅显示最少信息。基本上只包括操作ID、操作名称和操作对象。


SERIAL:跟TYPICAL类似,除了并行操作信息没有显示,即使执行计划有并行处理。


ALL:显示所有信息。


display_cursor说明


aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYxMTMwMjAzNzM1MTgz.png


DISPLAY_CURSOR函数,它显示存储在库缓存(library cache)中的实际执行计划,当然你要查询某个SQL语句的实际执行计划,前提是这个SQL的执行计划还在库缓存中,如果它已经被刷出库缓存,就无法获取其实际执行计划。


执行方法

select * from table(DBMS_XPLAN.display_cursor(.....));

栗子

--执行sql
select  e.ename  from emp e ,dept d where e.deptno=d.deptno
 and e.empno=7499 ;
--获取这个SQL的sql_id和 child_number
SELECT sql_id, child_number from v$sql a  
where a.SQL_TEXT 
like '%select  e.ename  from emp e ,dept d where e.deptno=d.deptno%';
--说明:查询v$sql视图,找到该语句的sql_id,有可能该SQL语句不在Share Pool里面了,此时表明该SQL已经被踢出Share Pool。
--查询执行计划 
select * from table(DBMS_XPLAN.display_cursor('9uz917qhd6dv0',0));
--说明:不传递任何参数给display_cursor函数,表示显示当前会话最后一条SQL语句的执行计划


aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYxMTMwMjAyMTU1MDgy.png


相关文章
|
2月前
|
SQL 存储 关系型数据库
SQL优化之Explain详解(mysql)
`Explain`是MySQL中用于分析SQL查询执行计划的工具。它可以帮助我们了解MySQL如何执行SQL语句,包括如何使用索引、预计的行数以及查询的顺序。以下是`Explain`输出的关键列及其含义的简要摘要: 1. **id**:查询的序列号,表示查询中的子句层次,id越大优先级越高。 2. **select_type**:表示查询的类型,如SIMPLE(简单查询)、PRIMARY(主查询,多表查询中的第一个查询)、SUBQUERY(子查询)、DERIVED(派生表)或UNION(UNION操作的查询部分)。 3. **table**:查询涉及的表名,如果是子查询,可能显示为衍生表
46 0
|
1月前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(4)-SQL性能分析-profile详情、explain(profile查看指令,explain执行计划中各个字段的含义)
MySQL数据库——索引(4)-SQL性能分析-profile详情、explain(profile查看指令,explain执行计划中各个字段的含义)
26 2
|
2月前
|
SQL 分布式计算 大数据
利用SparkSQL Logical Plan Parse 打造大数据平台SQL诊断利器
利用SparkSQL Logical Plan Parse 打造大数据平台SQL诊断利器
27 0
|
2月前
|
SQL 关系型数据库 MySQL
explain是什么?explain优缺点及如何使用explain优化SQL
explain是什么?explain优缺点及如何使用explain优化SQL
55 1
|
2月前
|
SQL XML 前端开发
sql 性能优化基于explain调优(二)
sql 性能优化基于explain调优(二)
33 0
|
2月前
|
SQL 前端开发 索引
sql 性能优化基于explain调优
sql 性能优化基于explain调优
27 0
|
2月前
|
数据库 SQL 索引
什么是数据库 SQL Execution Plan
什么是数据库 SQL Execution Plan
|
9月前
|
SQL 存储 关系型数据库
【MYSQL高级】Mysql的SQL性能分析【借助EXPLAIN分析】
【MYSQL高级】Mysql的SQL性能分析【借助EXPLAIN分析】
84 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL SQL性能分析 慢查询日志、explain使用
MySQL SQL性能分析 慢查询日志、explain使用
156 0
|
2月前
|
SQL 关系型数据库 MySQL
mysql explain 详解及sql优化指南
mysql explain 详解及sql优化指南
38 0

推荐镜像

更多