暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

解读执行计划一

原创 由迪 2020-06-08
1155

我们掌握了获取和显示执行计划的方法后,就可以开了了解如何来读懂一个执行计划。从我们前面的示例中可以发现,一个执行计划实际上是一个树状关系的结构图。在这个树状结构图中,每一个节点代表了一个操作(相应的,它们在 PLAN_TABLE、V$SQL_PLAN 等执行计划表、视图中都有一条记录),每个枝节点(或者说父节点)下都有一个或多个子操作;除根节点外,每个节点都仅隶属于一个枝节点。同一层操作按照他们的 ID 顺序执行。操作由顶向下调用,即父操作调用子操作;数据由底向上返回,即子节点获取到的数据在处理完成后返回给父节点。

执行计划的基本数据

我们以以下查询计划为例,解释计划访问中基本数据的含义。

image.png

我们这里利用 DBMS_XPLAN 显示查询计划。它是以表格样式输出查询计划的。该表有多个列, 其中 Id 是计划中每个操作的唯一序列号,Operation 是每个操作的名称和方式,Name 是操作的对象。实际上,该表还有其他一些列代表了优化、统计等信息,我们在下一节解释这些列的含义。我们再看每行记录的数据。如果留意看,就不难发现每行数据中的 Operation 都带有长短不一的前导空格,使之看起来成为一个树状结构。这个结构也就是我们之前所提到的操作之间的调用关系。

首先看第一条,Id 为 0,操作为 SELECT STATEMENT。这一条记录实际上只是表示这条语句的类型是一条 SELECT 语句,而非一个真正的操作。因此在有一些执行计划的显示当中, 没有显示 Id 为 0 的操作。Id 为 1 的操作是 NESTED LOOPS,表明它需要对两个数据集以前套循环的方式进行数据关联。而这两个数据集则是有其两个子操作 2 和 4 分别从表 T_USERS 和 T_OBJECTS 上读取得来,也就是说,操作 1 按顺序调用操作 2 和 4,获取它们返回的数据进行关联。而要实现前套循环,就需要两个循环体。其中,操作 2 就是第一个循环体,也就是外循环;操作 4 就是第二个循环,即内循环;Id 为 2 的操作是 TABLE ACCESS BY INDEX ROWID,Name 是 T_USERS,表明它是通过索引上的 ROWID 来访问表 T_USERS 以获取数据。而索引上的 ROWID 则需要通过其子操作 3 来获取;Id 为 3 的操作是 INDEX UNIQUE SCAN,Name 是 T_USERS_PK,表明它是对索引。T_USERS_PK 进行唯一键值的访问以获取其父操作所需要的 ROWID。从之前的 DDL 语句我们知道,T_USERS_PK 是表 T_USERS 的主键,也是一个唯一索引。而对唯一索引的唯一键值的访问,需要有一个数值的输入作为访问条件。在它的 Id 列,我们可以留意到它被一个*符号标识了,这就表示这个操作有相关的谓词条件(访问条件或者过滤条件)。而我们这里也特地显示了谓词条件。在谓词信息输出部分,我们可以找到一条信息 3 - access("U"."USER_ID"=TO_NUMBER(:B)),表明这是操作 Id 为 3 的谓词条件,其中 access 表示它是访问条件,内容是通过某个数值定位 USER_ID 建值。

**提示**:访问条件和过滤条件都属于谓词条件,但它们对操作的作用大不相同。访问条件可以帮助操 作从物理物理对象上定位到符合条件的数据,然后再读取数据;而过滤条件是操作已经从物理存储 上读取到了数据,然后将不符合条件的数据过滤掉。它们对语句的性能影响很大,了解了他们之间 差别,就有助于我们对语句进行进一步调优。

· Id 为 4 的操作是 TABLE ACCESS FULL,Name 是 T_OBJECTS,表明它是对表 T_OBJECTS 进行全表扫描。全表扫描即读取表的物理段(Segment)的高水位线(High Water Mark,HWM) 以下的所有数据块。同样,它的 Id 也被*符合标识了,从谓词信息部分可以找到关联的谓词条件 4 - filter("O"."OBJECT_NAME" LIKE :A AND "U"."USERNAME"="O"."OWNER")。filter 表明它是一个过滤条件,即读取了表 T_OBJECTS 的所有数据,在过滤掉不符合条件("O"."OBJECT_NAME" LIKE :A AND "U"."USERNAME"="O"."OWNER")的数据。 通过执行计划,我们就可以清楚的了解一条语句是通过什么样的方式读取物理对象的数据,如 何对数据进行处理(过滤、排序等),最终获取到符合条件的数据。再结合执行计划中的其他数据, 我们就可以进一步的定位到语句的性能瓶颈在哪里,从而为我们实施优化奠定基础。

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

评论