数据仓库服务 GaussDB(DWS)-SQL执行计划:EXPLAIN PERFORMANCE详解

时间:2025-02-12 15:04:48

EXPLAIN PERFORMANCE详解

在SQL调优过程中经常需要执行EXPLAIN ANALYZE或EXPLAIN PERFORMANCE查看SQL语句实际执行信息,通过对比实际执行与优化器的估算之间的差别来为优化提供依据。EXPLAIN PERFORMANCE相对于EXPLAIN ANALYZE增加了每个DN上的执行信息。

表定义如下:

12
CREATE TABLE tt01(c1 int, c2 int) DISTRIBUTE BY hash(c1);CREATE TABLE tt02(c1 int, c2 int) DISTRIBUTE BY hash(c2);

以如下SQL查询语句为例:

1
SELECT * FROM tt01,tt02 WHERE tt01.c1=tt02.c2;

执行EXPLAIN PERFORMANCE输出的显示执行信息分为以下8个部分:

  1. 执行计划

    以表格的形式将计划显示出来,包含有11个字段,分别是:id、operation、A-time、A-rows、E-rows、E-distinct、Peak Memory、E-memory、A-width、E-width和E-costs。字段含义如下表1

    表1 执行字段说明

    字段

    描述

    id

    执行算子节点编号。

    operation

    具体的执行节点算子名称。

    Vector前缀的算子是指向量化执行引擎算子,一般出现含有列存表的Query中。

    Streaming是一个特殊的算子,它实现了分布式架构的核心数据shuffle功能,Streaming共有三种形态,分别对应了分布式结构下不同的数据shuffle功能:
    • Streaming (type: GATHER):作用是coordinator从DN收集数据。
    • Streaming(type: REDISTRIBUTE):作用是DN根据选定的列把数据重分布到所有的DN。
    • Streaming(type: BROADCAST):作用是把当前DN的数据广播给其他所有的DN。

    A-time

    各DN相应算子执行时间,一般DN上执行的算子的A-time是由[]括起来的两个值,分别表示此算子在所有DN上完成的最短时间和最长时间,包括下层算子执行时间。

    注意:在整个计划中,除了叶子节点的执行时间是算子本身的执行时间,其余算子的执行时间均包含子节点的执行时间。

    A-rows

    表示相应算子输出的全局总行数。

    E-rows

    每个算子估算的输出行数。

    E-distinct

    表示hashjoin算子的distinct估计值。

    Peak Memory

    此算子在每个DN上执行时使用的内存峰值,[]中左侧为最小值,右侧为最大值。

    E-memory

    DN上每个算子估算的内存使用量,只有DN上执行的算子会显示。某些场景会在估算的内存使用量后使用括号显示该算子在内存资源充足下可以自动扩展的内存上限。

    A-width

    表示当前算子每行元组的实际宽度,仅对于重内存使用算子会显示,包括:(Vec)HashJoin、(Vec)HashAgg、(Vec)HashSetOp、(Vec)Sort、(Vec)Materialize算子等,其中(Vec)HashJoin计算的宽度是其右子树算子的宽度,会显示在其右子树上。

    E-width

    每个算子输出元组的估算宽度。

    E-costs

    每个算子估算的执行代价。
    • E-costs是优化器根据成本参数定义的单位来衡量的,习惯上以磁盘页面抓取为1个单位, 其它开销参数将参照它来设置。
    • 每个节点的开销(E-costs值)包括它的所有子节点的开销。
    • 开销只反映了优化器关心的东西,并没有把结果行传递给客户端的时间考虑进去。虽然这个时间可能在实际的总时间里占据相当重要的分量,但是被优化器忽略了,因为它无法通过修改规划来改变。
  2. SQL Diagnostic Information

    SQL自诊断信息。优化和执行过程中识别到的性能优化点,当对DML语句进行带VERBOSE属性的EXPLAIN(EXPLAIN PERFORMANCE内置自带VERBOSE属性)时,SQL自诊断信息也会输出,以辅助性能问题定位。

  3. Predicate Information (identified by plan id)

    谓词过滤这部分主要显示的是对应执行算子节点的过滤条件,即在整个计划执行过程中不会变的信息,主要是一些join条件和一些filter信息。

  4. Memory Information (identified by plan id)

    内存使用信息这部分显示的是整个计划中会将内存的使用情况打印出来的算子的内存使用信息,主要是Hash、Sort算子,包括算子峰值内存(peak memory),优化器预估的内存(estimate memory),控制内存(control memory),估算内存使用(operator memory),执行时实际宽度(width),内存使用自动扩展次数(auto spread num),是否提前下盘(early spilled),以及下盘信息,包括重复下盘次数(spill Time(s)),内外表下盘分区数(inner/outer partition spill num),下盘文件数(temp file num),下盘数据量及最小和最大分区的下盘数据量(written disk IO [min, max] )。其中sort算子不会显示具体的下盘文件数,仅在显示排序方法时显示Disk。

  5. Targetlist Information (identified by plan id)

    这一部分显示的是每一个算子对应的输出目标列信息。

  6. DataNode Information (identified by plan id)

    这部分将各个算子的执行时间(若包含过滤及投影也会显示对应的执行时间)、CPU、buffer的使用情况全部打印出来。

    • 算子执行信息

      每个算子的执行信息都包含三个部分:
      • dn_6001_6002/dn_6003_6004表示具体执行的节点信息,括号中的信息是实际的执行信息。
      • actual time表示实际的执行时间,第一个数字表示执行时进入当前算子到输出第一条数据所花费的时间,第二个数字表示输出所有数据的总执行时间。
      • rows表示当前算子输出数据行数。
      • loops表示当前算子的执行次数。需要注意,对于分区表来说,每一个分区表的扫描就是一次完整的扫描操作,当切换到下一个分区的时候,又是一次新的扫描操作。
    • CPU信息

      每个算子执行的过程都有CPU信息,其中cyc代表的是CPU的周期数,ex cyc表示的是当前算子的周期数,不包含其子节点;inc cyc是包含子节点的周期数;ex row是当前算子输出的数据行数;ex c/r则是ex cyc/ex row得到的每条数据所用的平均周期数。

    • Buffer信息

      buffers显示缓冲区信息,包括共享块和临时块的读和写。

      共享块包含表和索引,临时块在排序和物化中使用的磁盘块。上层节点显示出来的块数据包含了其所有子节点使用的块数。

  7. User Define Profiling

    自定义信息,这一部分显示的是CN和DN、DN和DN建连的时间,以及存储层的一些执行信息。

  8. Query Summary

    这一部分主要打印总的执行时间和网络流量,包括了各个DN上初始化和结束阶段的最大最小执行时间、CN上的初始化、执行、结束阶段的时间,以及当前语句执行时系统可用内存、语句估算内存等信息。

    • DataNode executor start time:DN执行器开始时间,[min_node_name, max_node_name] : [min_time, max_time]
    • DataNode executor run time:DN执行器运行时间,[min_node_name, max_node_name] : [min_time, max_time]
    • DataNode executor end time:DN执行器结束时间,[min_node_name, max_node_name] : [min_time, max_time]
    • Remote query poll time:接收结果时用于poll等待的时间
    • System available mem:系统可用内存
    • Query Max mem:查询最大内存
    • Enqueue time:入队时间
    • Coordinator executor start time:CN执行器开始时间
    • Coordinator executor run time:CN执行器运行时间
    • Coordinator executor end time:CN执行器结束时间
    • Parser runtime:解析器运行时间
    • Planner runtime:优化器执行时间
    • 网络流量,stream算子发送的数据量
    • Query Id:查询ID
    • Unique SQL ID:约束SQL ID
    • Total runtime:总执行时间
  • A-rows和E-rows的差异体现了优化器估算和实际执行的偏差度。一般情况下两者偏差越大,则可以认为优化器生成的计划的越不可信,人工干预调优的必要性越大。
  • A-time中的两个值偏差越大,表明此算子的计算偏斜(在不同DN上执行时间差异)越大,人工干预调优的必要性越大。一般来说,两个相邻的算子,上层算子的执行时间包含下层算子的执行时间,但如果上层算子为stream算子,由于各线程不存在驱动关系,上层算子执行时间可能小于下层算子的执行时间,即不存在包含关系。
  • Max Query Peak Memory经常用来估算SQL语句耗费内存,也被用来作为SQL语句调优时运行态内存参数设置的重要依据。一般会以EXPLAIN ANALYZE或EXPLAIN PERFORMANCE的输出作为进一步调优的输入。
support.huaweicloud.com/devg-dws/dws_04_0432.html