执行计划查看方法(Explain plan)

2024-09-07 00:08

本文主要是介绍执行计划查看方法(Explain plan),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


什么是执行计划

所谓执行计划,顾名思义,就是对一个查询任务,做出一份怎样去完成任务的详细方案。举个生活中的例子,我从珠海要去英国,我可以

选择先去香港然后转机,也可以先去北京转机,或者去广州也可以。但是到底怎样去英国划算,也就是我的费用最少,这是一件值得考究

的事情。同样对于查询而言,我们提交的SQL仅仅是描述出了我们的目的地是英国,但至于怎么去,通常我们的SQL中是没有给出提示信息

的,是由数据库来决定的。


生成执行计划的方法

1.设置autotrace

序号

命令

解释

1

SET AUTOTRACE OFF

此为默认值,即关闭Autotrace 

2

SET AUTOTRACE ON EXPLAIN

只显示执行计划

3

SET AUTOTRACE ON STATISTICS

 只显示执行的统计信息

4

SET AUTOTRACE ON

 包含2,3两项内容

5

SET AUTOTRACE TRACEONLY

 与ON相似,但不显示语句的执行结果

例:

SQL> select * from emp; 


执行计划
----------------------------------------------------------
Plan hash value: 3956160932

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    14 |   532 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    14 |   532 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------


统计信息
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          8  consistent gets
          0  physical reads
          0  redo size
       1455  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         14  rows processed

2.使用SQL

SQL>EXPLAIN PLAN FOR sql语句;

SQL>SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));

SQL> explain plan for select * from emp;
 
Explained
 
SQL> select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    14 |   532 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    14 |   532 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------
 
8 rows selected

OR
 
SQL> SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    14 |   532 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    14 |   532 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------
 
8 rows selected


3.使用Toad,PL/SQL develpoer等工具

这个方法就不详细介绍了,在工具上找到点一点就行了。


执行计划中各个列的含义:

在执行计划中,除了ID、Operation和Name之外,还有其他一些列。这些列的数据是根据需要从PLAN_TABLE、V$SQL_PLAN、V$SQL_PLAN_STATISTICS_ALL等表和视图中读取的。它们可以帮助我们进一步理解该执行计划(例如优化器对各个操作的估算数据、实际运行中各个操作的性能数据等)。以下就是各个列的描述。

Rows/E-Rows:优化器估算出当前操作返回给上一级操作的数据记录数,如果计划中同时输出收集到实际记录数,则会显示为E-Rows以和实际记录数区别,在优化器中,又称为数据集的势(Cardinality);

Bytes/E-Bytes:优化器估算出当前操作返回给上一级操作的数据的字节数,如果计划中同时输出收集到实际字节数,则会显示为E-Bytes以和实际字节数区别;

TempSpc/E-Temp:优化器估算出完成当前操作(仅部分操作需要临时空间,如SORT、Hash Join)所需要的临时表空间的大小,如果计划中同时输出收集到实际临时空间大小,则会显示为E-Temp以和实际临时空间大小区别;

Cost(%CPU):优化器估算出完成当前操作的代价(包含子操作的代价),它是IO代价和CPU代价总和。其中,IO代价是最基本的代价。而对于CPU代价,在默认情况下,优化器会将CPU代价计算在内,并且将CPU代价根据系统配置由特定的转换公式转换为IO代价。也可以通过优化器参数_optimizer_cost_model指定是否在代价模型中包括CPU代价。括号中数据即为CPU代价在总代价中的比例;

Time/E-Time:优化器估算出完成当前操作所需要的时间,这个时间是其子操作的累计时间,如果计划中同时输出收集到实际时间,则会显示为E-Time以和实际时间区别;

Pstart:分区裁剪(Partition Prunning)后,访问的起始分区,仅在含有分区表访问操作的执行计划中出现;

Pstop:分区裁剪(Partition Prunning)后,访问的结束分区,仅在含有分区表访问操作的执行计划中出现;

Inst:分布式查询中,远程对象所在的数据库实例名;

TQ:并行查询中的表队列(Table Queue),我们会在相关操作中进一步阐述该列数据;

IN-OUT:并行查询或分布式查询中数据传输方式;

PQ Distrib:并行查询中,并行服务进程之间的数据分发方式;

Starts:当前操作实际被启动的次数,如果输出格式中指定了LAST关键字,则为计划最后一次执行中当前操作实际被启动的次数,否则为所有被启动次数总和;

Rows:当前操作实际返回的记录数,如果输出格式中指定了LAST关键字,则为最后一次执行的记录数,否则为所有执行的记录数总和;

Time:执行当前操作的实际时间,如果输出格式中指定了LAST关键字,则为最后一次执行的时间,否则为所有执行的时间总和;

Buffers:当前操作中发生读内存的次数,如果输出格式中指定了LAST关键字,则为最后一次执行的读内存次数,否则为所有执行的读内存次数总和。内存读次数包括一致性读(Consistent Read,CR)和当前模式读(Current Get,CU);

Reads:当前操作中发生读磁盘的次数,如果输出格式中指定了LAST关键字,则为最后一次执行的读磁盘次数,否则为所有执行的读磁盘次数总和;

Writes:当前操作中发生写磁盘的次数,如果输出格式中指定了LAST关键字,则为最后一次执行的写磁盘次数,否则为所有执行的写磁盘次数总和;

OMem:当前操作完成所有内存工作区(Work Area)操作所总共使用私有内存(PGA)中工作区的大小。需要使用内存工作区的操作为:哈希操作,如哈希分组(Hash Group)、哈希关联(Hash Join)和排序(Sort)操作,它们分别占有工作区中哈希区(Hash Area)和排序区(Sort Area)进行工作,这个数据是由优化器统计数据以及前一次执行的性能数据估算得出的;

1Mem:当工作区大小无法满足操作所需要的大小时,需要将部分数据写入临时磁盘空间中(如果仅需要写入一次就可以完成操作,就称为一次通过,One-Pass;否则为多次通过,Multi-Pass)。该列数据为语句最后一次执行中,单次写磁盘所需要的内存大小,这个数据是由优化器统计数据以及前一次执行的性能数据估算得出的;

Used-Mem:语句最后一次执行中,当前操作所使用的内存工作区大小,括号里面为(发生磁盘交换的次数,1次即为One-Pass,大于1次则为Multi-Pass,如果没有使用磁盘,则显示OPTIMAL);

Used-Tmp:语句最后一次执行中,当前操作所使用的临时段的大小,无法一次在工作区完成操作的数据被临时写入该段;

O/1/M:语句所有的执行总共使用内存或磁盘完成操作的执行次数,分别是Optimal(优化的,仅适用内存完成操作)/One-Pass/Multi-Pass;

Max-Tmp:语句所有执行中,当前操作所使用的临时段的最大空间。





这篇关于执行计划查看方法(Explain plan)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143504

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -