暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

解读执行计划二

原创 由迪 2020-06-12
1166

内部函数与操作

​ 实际上,在 Oracle 内部,执行计划的每一个操作都与一个函数相对应,而操作对象、谓词条件都是这些函数的参数。这些函数之间可以相互调用,也正是这些函数的调用关系,映射成为了执行计划的树状关系。换句话说,一个执行计划告诉 Oracle 的内部引擎如何调用这些函数、以及传给函数的参数值。

​ 例如,在上述例子中,NESTED LOOPS 获取数据的内部函数是 qerjoFetch;TABLE ACCESS BY INDEX ROWID 的内部函数是 qertbFetchByRowID;INDEX UNIQUE SCAN 的内部函数是qerixFetchUniqueIndex;TABLE ACCESS FULL 的内部函数是 qertbFetch。

提示:从这个意义上来说,我们可以将一个执行计划视为一段伪代码或者一段解释型语言的代码,SQL 执行引擎则负责解释和执行该段代码。

执行计划各个列的含义

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

· 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:语句所有执行中,当前操作所使用的临时段的最大大小;

执行计划各个操作的含义

​ 通常我们所说的执行计划操作包含两个部分:操作与其选项。例如:哈希管理反关联(HASH JOIN ANTI)中,哈希关联(HASH JOIN)是一种操作,“反”关联(ANTI)则是其选项;该操作还可以与其他选项(如“半”关联,SEMI)配合形成不同的执行计划操作。

​ 执行计划中的操作数量非常多。我们以下列出的操作是 Oracle 10gR2 中的绝大多数操作。

Oracle 的每个版本都会有一些新的特性出现,而其中一些新特性又会带来新的操作,或者抛弃一些老的操作。如果发现执行计划出现新操作,读者可以结合相关新特性的描述,就不难理解该操作的 含义。

​ 实际上,在执行计划里出现的操作包含两个信息,一个是操作类型(在 PLAN_TABLE,V$SQL_PLAN 等表或视图中,字段名为 OPERATION),一个是操作的选项(在相关表和视图中,字段名为 OPTIONS)。例如 TABLE ACCESS BY INDEX ROWID,它的操作类型是 TABLE ACCESS,即访问表,选项是 BY INDEX ROWID,即通过索引中的 ROWID 来访问表。

提示:在 11g 中,可以通过固化表 XXPLTON 和 XXPLTOO 分别查询出所有操作类型和选项名称。一个操作可以有 0 到多个选项。但并不是所有选项都能用于所有的操作。

​ 为了便于读者更好地理解这些操作,我们对这些操作类型进行了归类。但这个归类并非一个绝 对的划分,例如,某些操作可以被划分到多个类别中(如 MERGE JOIN PARTITION OUTER,既是 一个数据关联操作,又是一个分区操作),但我们会按照其余其他操作的相关性划分在某个类别中。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论