如何处理行数稍多的执行计划

2023年 11月 16日 68.1k 0

我们来看一下图10-9中的执行计划所执行的操作(图10-10展示了其父-子关系的图形表示)。我有意不提供用来生成它的SQL语句。对于我们的目的而言,你不需要关心SQL语句本身。换句话说,执行计划才是关键。

图10-9 一个执行计划按块进行分解。左边的数字用于识别操作。右边的字母用于识别块

首先,有必要将查询计划分解为基础的块,并识别执行的顺序。为此,你需要实施以下步骤。最开始为了读取执行计划,你必须识别组成它的组合操作(包括关联的和无关联的)。也就是说,你需要识别每一个拥有不止一个子操作的操作。在图10-9所示的例子中,组合操作包括:3、4、5、6和14。

 

然后,对于每个组合操作中的每个子操作,都定义一个块。因为在图10-9中有五个组合操作,而且它们当中的每一个都有两个子操作,所以一共有十个块。例如,对于操作3,第一个子操作包含从第4行到第12行(块G),而第二个子操作包含从第13行到第16行(块J)。注意在图10-9中,每个块都被一个方框分隔开来。最终,你需要找出这些块的执行顺序。为了观察这是如何完成的,我们完成图10-9中展示的执行计划,并应用之前讨论的规则。

 

(1)操作0是一个独立操作,它的子操作(1)在它之前执行。

(2)操作1是一个独立操作,它的子操作(2)在它之前执行。

(3)操作2是一个独立操作,它的子操作(3)在它之前执行。

(4)操作3是一个独立操作,它的子操作在它之前执行。因为第一个子块(G)在第二个子块(J)之前执行,我们继续看第一个子块的第一个操作(4)。

(5)操作4是一个无关联组合操作,它的子操作在它之前执行。因为第一个子块(E)在第二个子块(F)之前执行,我们继续看第一个子块(E)的第一个操作(5)。

(6)操作5是一个关联组合操作,它的子操作在它之前执行。因为第一个子块(C)在第二个子块

(D)之前执行,我们继续看第一个子块(C)的第一个操作(6)。

(7)操作6是一个关联组合操作,它的子操作在它之前执行。因为第一个子块(A)在第二个子块(B)之前执行,我们继续看第一个子块(A)的第一个操作(7)。

(8)操作7是一个独立操作而且没有子操作。这意味着你终于找到了第一个被执行的操作(因为它在块A中)。该操作扫描一张表,并将数据返回给它的父操作(6)。

(9)块B需要为由块A返回的每一行都执行一遍。在这个块中,起初操作9扫描一个索引,然后操作8使用返回的rowid访问一张表,并最终将数据返回给它的父操作(6)。

(10)操作6在由块A和B返回的数据之间执行联接操作,然后将结果返回给它的父操作(5)。

(11)块D需要为由块C返回的每一行都执行一遍。换句话说,对于由操作6返回给其父操作(5)的每一行,它都被执行了一次。在这个块中,一开始是操作11扫描一个索引。然后,操作10通过返回的rowid访问一张表,并将数据返回给它的父操作(5)。

(12)操作5在由块C和D返回的数据之间执行联接操作,然后将结果返回给它的父操作(4)。

(13)操作12(块F)仅执行一次。它扫描一张表,然后将结果返回给它的父操作(4)。

(14)操作4在由块E和F返回的数据之间执行联接操作,然后将结果返回给它的父操作(3)。

(15)块J基本上是对于块G返回的每一行数据都要执行一次。换句话说,对于由操作4返回给其父操作(3)的每一行数据,它都要被执行一次。在这个块中,首先操作15扫描一张表,然后将数据返回给它的父操作(14)。接下来,操作16扫描一张表,并将数据返回给它的父操作(14)。做完这些,操作14将它的各个子操作返回的数据放到一起,并将结果返回给它的父操作(13)。最后,操作13移除部分冗余的数据。注意,这个块不会将数据返回给其父操作。实际上,父操作是一个FILTER操作,而且第二个子操作仅用来应用一个限制条件。

(16)一旦操作3在块J上应用了过滤条件,就将结果返回给它的父操作(2)。

(17)操作2执行一个GROUP BY操作并将结果返回给它的父操作(1)。

(18)操作1应用一个过滤条件然后将结果返回给调用者。

 

概括起来,注意各个块是按照它们的标识符顺序执行的(从A一直到J)。一些块(A、C、E、F以及G)至多执行一次,而其他的块(B、D、H、I以及J)则可能执行多次(或根本不执行),这要取决于驱动它们的操作返回了多少条数据。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论