执行计划

article/2025/9/29 5:57:22

一、什么是执行计划(explain plan)

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

二、如何查看执行计划

1: 在PL/SQL下按F5查看执行计划。第三方工具toad等。

很多人以为PL/SQL的执行计划只能看到基数、优化器、耗费等基本信息,其实这个可以在PL/SQL工具里面设置的。可以看到很多其它信息,如下所示

clip_image002

2: 在SQL*PLUS(PL/SQL的命令窗口和SQL窗口均可)下执行下面步骤

 

 SQL>EXPLAIN PLAN FORSELECT * FROM SCOTT.EMP;  --要解析的SQL脚本SQL>SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

 

 

clip_image004

clip_image006

3: 在SQL*PLUS下(有些命令在PL/SQL下无效)执行如下命令:


SQL>SET TIMING ON             --控制显示执行时间统计数据


SQL>SET AUTOTRACE ON EXPLAIN       --这样设置包含执行计划、脚本数据输出,没有统计信息


SQL>执行需要查看执行计划的SQL语句


SQL>SET AUTOTRACE OFF           --不生成AUTOTRACE报告,这是缺省模式


SQL> SET AUTOTRACE ON           --这样设置包含执行计划、统计信息、以及脚本数据输出


SQL>执行需要查看执行计划的SQL语句


SQL>SET AUTOTRACE OFF


SQL> SET AUTOTRACE TRACEONLY      --这样设置会有执行计划、统计信息,不会有脚本数据输出


SQL>执行需要查看执行计划的SQL语句


SQL>SET AUTOTRACE TRACEONLY STAT     --这样设置只包含有统计信息


SQL>执行需要查看执行计划的SQL语句

三、看懂执行计划

1.执行顺序

执行顺序的原则是:由上至下,从右向左

由上至下:在执行计划中一般含有多个节点,相同级别(或并列)的节点,靠上的优先执行,靠下的后执行

从右向左:在某个节点下还存在多个子节点,先从最靠右的子节点开始执行。

当然,你在PL/SQL工具中也可以通过它提供的功能来查看执行顺序。如下图所示:

clip_image014

2.执行计划中字段解释

clip_image016

SQL>

名词解释:

recursive calls           递归调用

db block gets           从buffer cache中读取的block的数量当前请求的块数目,当前模式块意思就是在操作中正好提取的块数目,而不是在一致性读的情况下而产生的正常情况下,一个查询提取的块是在查询查询开始的那个时间点上存在的数据库,当前块是在这个时候存在数据块,而不是这个时间点之前或者之后的的数据块数目。

consistent gets          从buffer cache中读取的undo数据的block的数量数据请求总数在回滚段Buffer中的数据一致性读所需要的数据块,,这里的概念是在你处理你这个操作的时侯需要在一致性读状态上处理多个块,这些块产生的主要原因是因为你在查询过程中,由于其它会话对数据 块进行操作,而对所要查询的块有了修改,但是由于我们的查询是在这些修改之前调用的,所要需要对回滚 段中的数据块的前映像进行查询,以保证数据的一致性。这样就产生了一致性读。

 

physical reads           物理读 就是从磁盘上读取数据块的数量。其产生的主要原因是:

                  1:在数据库高速缓存中不存在这些块。

                  2:全表扫描

                  3:磁盘排序

redo size              DML生成的redo的大小

sorts (memory)           在内存执行的排序量

sorts (disk)             在磁盘执行的排序量

2091 bytes sent via SQL*Net to client     从SQL*Net向客户端发送了2091字节的数据

416 bytes received via SQL*Net from client  客户端向SQL*Net发送了416字节的数据。

参考文档:SQLPlus User’s Guide and Reference Release 11.1

clip_image018

db block gets 、 consistent gets 、 physical reads这三者的关系可以概括为:逻辑读指的是ORACLE从内存读到的数据块块数量,一般来说是:

consistent gets + db block gets. 当在内存中找不到所需要的数据块的话,就需要从磁盘中获取,于是就产生了物理读。

3.具体内容查看

1> Plan hash Value

这一行是这一条语句的的hash值,我们知道ORACLE对每一条ORACLE语句产生的执行计划放在SHARE POOL里面,第一次要经过硬解析,产生hash值。下次再执行时比较hash值,如果相同就不会执行硬解析。

2> COST

 

COST没有单位,是一个相对值,是SQL以CBO方式解析执行计划时,供ORACLE来评估CBO成本,选择执行计划用的。没有明确的含义,但是在对比是就非常有用。

公式:COST=(Single Block I/O COST + MultiBlock I/O Cost + CPU Cost)/ Sreadtim

 

3> 对上面执行计划列字段的解释:

Id: 执行序列,但不是执行的先后顺序。执行的先后根据Operation缩进来判断(采用最右最上最先执行的原则看层次关系,在同一级如果某个动作没有子ID就最先执行。一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。)

    Operation:当前操作的内容。

    Name:操作对象

    Rows:也就是10g版本以前的Cardinality(基数),Oracle估计当前操作的返回结果集行数。

    Bytes:表示执行该步骤后返回的字节数。

    Cost(CPU):表示执行到该步骤的一个执行成本,用于说明SQL执行的代价。

    Time:Oracle 估计当前操作的时间。

4.谓词说明:

Predicate Information (identified by operation id):

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

2 - filter("B"."MGR" IS NOT NULL)

4 - access("A"."EMPNO" = "B"."MGR")

    Access: 表示这个谓词条件的值将会影响数据的访问路劲(全表扫描还是索引)。

    Filter:表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。

    在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确。

5、 动态分析

如果在执行计划中有如下提示:

Note

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

-dynamic sampling used for the statement

这提示用户CBO当前使用的技术,需要用户在分析计划时考虑到这些因素。 当出现这个提示,说明当前表使用了动态采样。我们从而推断这个表可能没有做过分析。

这里会出现两种情况:

(1) 如果表没有做过分析,那么CBO可以通过动态采样的方式来获取分析数据,也可以或者正确的执行计划。

(2) 如果表分析过,但是分析信息过旧,这时CBO就不会在使用动态采样,而是使用这些旧的分析数据,从而可能导致错误的执行计划。

四、表访问方式

1.Full Table Scan (FTS) 全表扫描

 

2.Index Lookup 索引扫描

There are 5 methods of index lookup:

index unique scan --索引唯一扫描

通过唯一索引查找一个数值经常返回单个ROWID,如果存在UNIQUE或PRIMARY KEY约束(它保证了语句只存取单行的话),ORACLE

经常实现唯一性扫描

Method for looking up a single key value via a unique index. always returns a single value, You must supply AT LEAST the leading column of the index to access data via the index.

index range scan --索引局部扫描

Index range scan is a method for accessing a range values of a particular column. AT LEAST the leading column of the index must be supplied to access data via the index. Can be used for range operations (e.g. > < <> >= <= between) .

使用一个索引存取多行数据,在唯一索引上使用索引范围扫描的典型情况是在谓词(WHERE 限制条件)中使用了范围操作符号(如>, < <>, >=, <=,BWTEEN)

index full scan --索引全局扫描

Full index scans are only available in the CBO as otherwise we are unable to determine whether a full scan would be a good idea or not. We choose an index Full Scan when we have statistics that indicate that it is going to be more efficient than a Full table scan and a sort. For example we may do a Full index scan when we do an unbounded scan of an index and want the data to be ordered in the index order.

index fast full scan --索引快速全局扫描,不带order by情况下常发生

Scans all the block in the index, Rows are not returned in sorted order, Introduced in 7.3 and requires V733_PLANS_ENABLED=TRUE and CBO, may be hinted using INDEX_FFS hint, uses multiblock i/o, can be executed in parallel, can be used to access second column of concatenated indexes. This is because we are selecting all of the index.

index skip scan --索引跳跃扫描,where条件列是非索引的前提情况下常发生

Index skip scan finds rows even if the column is not the leading column of a concatenated index. It skips the first column(s) during the search.

3.Rowid 物理ID扫描

This is the quickest access method available.Oracle retrieves the specified block and extracts the rows it is interested in. --Rowid扫描是最快的访问数据方式



作者: 潇湘隐者
出处: http://www.cnblogs.com/kerrycode/

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.


http://chatgpt.dhexx.cn/article/PJfxTv16.shtml

相关文章

matlab画图基本命令

一、本文主要内容和相关参考博客 参考了xticklabel和xtick在matlab里的区别 和 label ‘ytick’的设置这两个网址。matlab在画图时会自动调整坐标轴间隔的大小&#xff0c;但是我们可以使用如set(gca,ytick,ylabel_pos,yticklabel,ylabel_str)的函数来实现自己调整间隔以画出…

MATLAB常用绘图命令

选择图型窗口命令 坐标轴相关命令 文字标示命令 栅格 离散数据处理

MATLAB画图命令zz

一、散点图 1&#xff0e;1&#xff0e;命令 plot 功能 线性二维图。在线条多于一条时&#xff0c;若用户没有指定使用颜色&#xff0c;则plot循环使用由当前坐标轴颜色顺序属性&#xff08;current axes ColorOrder property&#xff09;定义的颜色&#xff0c;以区别不同的…

slice matlab,Matlab画图之slice命令

满意答案 7a6o8yb4 2015.08.12 采纳率:55% 等级:8 已帮助:212人 close all; clc; clear; A = [1 2 2 25 1 3 3 21 1 4 4 20 2 5 5 19 2 6 7 31]; x = A(:, 1); y = A(:, 2); z = A(:, 3); s = A(:, 4); % 提取有效数据 xb = min(x); xe = max(x); yb = min(y); ye = max(…

Matlab画图命令介绍

这是matlab里最基本的命令&#xff0c;帮助那些没有学过matlab&#xff0c;只是用它来画画图的人。

matlab画图句柄

Hf_1figure(color, white);figure全部属性 Alphamap: [0 0.0159 0.0317 0.0476 0.0635 0.0794 … ]BeingDeleted: offBusyAction: queueButtonDownFcn: Children: [00 GraphicsPlaceholder]Clipping: onCloseRequestFcn: closereqColor: [1 1 1]Colormap: [2563 double]Context…

【转载】Matlab画图命令介绍

这是matlab里最基本的命令&#xff0c;帮助那些没有学过matlab&#xff0c;只是用它来画画图的人。

matlab 画图 浓淡有别,matlab画图命令汇总

matlab画图命令汇总(2010-11-16 21:46:24) 转载 一、plot系列 plot  |  plot3  |  plotyy  |  polar(极坐标) 二、image系列 image  |  imagesc  |  pcolor(伪彩图)  | 三、contour系列——等高线图 contour  |  contour3  |  contourc  |  …

matlab绘图命令

1、fplot() 该命令常用来绘制符号函数的图像&#xff1b;其具体格式为&#xff1a; fplot(fun,lims)&#xff0c;其中fun是符号函数表达式&#xff0c;lims用来声明绘图区间。 例如&#xff1a; 绘制函数&#xff1a;f(x)sinxx; >> lims[-5,5]>> fplot(sin(x)x,lim…

matlab绘图命令总结(重要!!!整理)

基本的绘图流程&#xff1a; &#xff08;1&#xff09;数据准备。 &#xff08;2&#xff09;设置当前绘图区。 &#xff08;3&#xff09;绘图。 &#xff08;4&#xff09;设置图形中曲线和标记点格式。 &#xff08;5&#xff09;设置坐标轴和网格线属性。 &#xff08;6&a…

MATLAB常用画图命令汇总

自己在建模时常用到的绘图命令&#xff0c;总结的时候也实操了一下&#xff0c;发现了很多通往新世界的大门 我不生产文章&#xff0c;我只是帮助中心的搬运工~​ &#xff08;一&#xff09;二维图像 1.散点图 scatter() ​scatter(x,y,sz,c,mkr.filled,) sz&#xff1a;指…

Prometheus完整搭建及实战各种监控

一.Prometheus介绍 Prometheus&#xff08;普罗米修斯&#xff09;是一个最初在SoundCloud上构建的监控系统。自2012年成为社区开源项目&#xff0c;拥有非常活跃的开发人员和用户社区。为强调开源及独立维护&#xff0c;Prometheus于2016年加入云原生云计算基金会&#xff08;…

Prometheus【普罗米修斯】+Grafana部署企业级监控之 promQL语法

一、PromQL介绍 PromQL (Prometheus Query Language) 是 Prometheus 自己开发的数据查询 DSL 语言&#xff0c;语言表现力非常丰富&#xff0c;内置函数很多&#xff0c;在日常数据可视化以及rules 告警中都会使用到它。 1.1 表达式数据类型&#xff1a; 在prometheus的表达…

Granafa监控仪表盘:自定义简约型-只显示资源总览,各个主机详情

目录 前言 Grafana选择监控仪表盘 自定义简约型-只显示资源总览&#xff0c;各个主机详情 监控仪表盘JSON数据 前言 相关参考&#xff1a;Windows监控&#xff1a;基于PrometheusGrafana监控CPU、内存、磁盘、网络、GPU信息 Grafana选择监控仪表盘 访问地址&#xff1a;htt…

翻译:Irate绘图更精准

原文&#xff1a;Irate graphs are better graphs | Robust Perception Prometheus 0.16.1 was just released, and with it brings my addition of the irate function. This offers more responsive graphs and higher resolution dashboards. 刚刚发布的普罗米修斯 0.16.1&a…

prometheus-rate、irate、increase函数使用场景

rate() rate(v range-vector)计算范围向量中时间序列的每秒平均平均增长率。单调性中断&#xff08;例如由于目标重启而导致的计数器重置&#xff09;会自动进行调整。同样&#xff0c;计算会外推到时间范围的末尾&#xff0c;从而允许遗漏刮擦或刮擦周期与该范围的时间段不完…

Prometheus监控 rate与irate的区别

对官网文档的解读irate和rate都会用于计算某个指标在一定时间间隔内的变化速率。但是它们的计算方法有所不同&#xff1a;irate取的是在指定时间范围内的最近两个数据点来算速率&#xff0c;而rate会取指定时间范围内所有数据点&#xff0c;算出一组速率&#xff0c;然后取平均…

Prometheus中 rate、irate、increase函数的使用场景

首先给出Prometheus的文档&#xff0c;建议先了解一下 官方文档 以及本文的参考文档&#xff1a; 参考文档 rate() rate(v range-vector)计算范围向量中时间序列的每秒平均平均增长率。单调性中断&#xff08;例如由于目标重启而导致的计数器重置&#xff09;会自动进行调整。…

PromQL 计算Counter指标增长率 rate irate increase

我们知道Counter类型的监控指标其特点是只增不减&#xff0c;在没有发生重置&#xff08;如服务器重启&#xff0c;应用重启&#xff09;的情况下其样本值应该是不断增大的。为了能够更直观的表示样本数据的变化剧烈情况&#xff0c;需要计算样本的增长速率。 如下图所示&…

PromQL 平均增长率 rate 函数 瞬时增长率 irate函数 只针对counter指标类型

计算Counter指标增长率 我们知道Counter类型的监控指标其特点是只增不减&#xff0c;在没有发生重置&#xff08;如服务器重启&#xff0c;应用重启&#xff09;的情况下其样本值应该是不断增大的。为了能够更直观的表示样本数据的变化剧烈情况&#xff0c;需要计算样本的增长速…