南大通用GBase 8a 执行计划Explain介绍

本文介绍GBaase 8a数据库集群的执行计划功能。包括语法以及一些常见场景的执行计划分析。

参考

如需要从简单到复杂的SQL执行计划学习,请参考

语法

explain/desc [extanded/partitions] select …
  • explain只能显示sql select部分的执行计划
  • 标准输出为explain,加extanded/partitions时可以以扩展方式和树形方式输出执行计划信息
  • 支持with … as select …类型的CTE(Common Table Expression)公用表表达式语法,需要集群层设置_t_gcluster_support_cte=1

说明

标准输出界面及主要组成部分

显示界面主要组成部分:

  • ID:SQL执行步骤,顺序从下向上
  • MOTION:某个步骤的结果处理方式
  • OPERATION:某个步骤内的具体执行操作
  • TABLE:某个operation涉及的表
  • CONDITION:某个operation操作涉及的条件

1234

执行计划每个列的含义

显示列具体释义
ID执行计划的步骤,从00开始,从显示界面的下方向上执行。
MOTION某个步骤的结果集处理方式,具体包括如下:
RESULT:结果发送到客户端,一般为执行计划的最后一步;
GATHER:结果发送到汇总节点,一般在sort或聚集函数操作前;
REDIST(…):结果HASH重分布,括号中为计算HASH的列,如果超长则截断为两个点;
NO REDIST:结果直接保存到对应的数据分片,不进行重分布;
BROADCAST:结果拉复制表;
RAND REDIST:结果随机分布到所有节点;
SCALAR N:结果为标量,N为标量子查询的编号,如果条件中有引用,则使用&xNx&方式引用。
OPERATION某个步骤的具体操作:
SCAN:单表扫描,并使用条件过滤数据;
Table:单表,没有过滤条件;
SubQueryN:子查询,N为自动编号;
Step:使用前一个Step的结果;
INNER/LEFT/FULL JOIN:连接操作;
WHERE:子查询的WHERE条件;
GROUP:分组操作;
ORDER:排序操作;
LIMIT:计算LIMIT,OFFSET;
AGG:distinct,聚集操作;
UNION/UNION ALL/MINUS/INTERSECT:UNION操作。
TABLE某个操作OPERATION涉及的表,只显示别名和属性,超长截断为两个点:
HASH分布表:中括号中显示HASH列;
复制表:显示[REP];
随机分布表:显示[DIS];
子查询:OPERATION列显示SubQueryN,其中N为数字,用来区分不同的子查询;
某个步骤的结果集:OPERATION列显示为Step,本列显示为<N>其中N为ID列中的对应值,表示该步骤的结果。
CONDITION显示某个操作OPERATION的条件:
SCAN操作单表过滤条件;
JOIN操作的连接条件;
GROUP BY操作涉及列或表达式;
ORDER BY操作涉及列或表达式;
LIMIT OFFSET内容。
执行计划每个列的含义

步骤内的执行计划缩进显示

样例1

SQL语句

一个内层多表LEFT JOIN,外层group的SQL。其中主表T1和T2表(OVIEW.ods_XXXX)是一个视图。

执行计划

解析

Step00

  • Step00在内存中物化视图T2表
  • T2表是视图,GBase中转换为子查询(SubQuery4)
  • T2表上无单表条件,因此视图基表ods_XXXX的OPXXXX是Table,表示单表且无过滤条件
  • MOTION中有REDIST(maXXX)表明ods_XXXX表需要按照maiXXX进行一次动态重分布,ods_XXXX表本身的分布列是id,重分布的原因是和t1表的关联列是maiXXX

Step01

  • Step01是T1表子查询内部的基表物化步骤,基表为ods_XXXXX
  • CONDITION中Where条件为CAST(INDATE AS DATE) <= CAST(‘2020-03-31’ AS DATE),GROUP BY条件为maXXXX
  • MOTION中有REDIST(maXXXX)表明odsXXXX需要按照mainno进行重分布, odsXXXXX表本身的分布列是id,重分布原因是T1表和T2表join的列是maXXXXX

step02

  • Step02是执行step01和step00的结果inner join的步骤,即T1 inner join T2的步骤
  • T1表是视图,因此GBase转成子查询SubQuery2
  • T1、T2表的join CONDITION为T1.MAXXX = T2.MAXXXX AND CAST(T1.INDATE AS DATE) = CAST(T2.INDATE AS DATE)
  • MOTION中有REDIST(userXXXX)表明step02步骤的结果集需要按照userXXXX进行重分布,step02结果集的分布列是maXXXX,重分布原因是和T3表join的列是userXXXX

Step03

  • Step03是执行step02的结果集和T3 left join的步骤
  • T3是视图,因此OPERATION为子查询SubQuery5,T3表上无单表条件,因此视图基表ods_XXXXr的OPERATION是Table,表示单表且无过滤条件
  • Left join的条件CONDITION为T2.USERXXXX = T3.USERXXXX,这一步的join因step02的结果集已经按useXXXX进行过重分布,T3表本身的分布列就是useXXXX,因此可以走静态hash join执行计划
  • MOTION中有REDIST(maXXXX)表明step03的结果集需要按照mainno列进行一次重分布,原因是step04中的join条件是T1.MAXXXX = T4.CLXXXX,且T4表的分布列是CLXXXX

Step04

  • Step04是执行step03结果集和T4表left join的步骤
  • 根据缩进格式,首先执行stop03结果集<03>和T4表的left join,然后执行where条件过滤,最后执行GROUP BY
  • T4表是视图,所以GBase转为子查询SubQuery6,基表clm_XXXX为单表没有单表条件,因此OPERATION为Table
  • 这一步的结果集<03>的分布列本身为maXXXX(由step03中的MOTION重分布得来),T4表的分布列是claim_XXXX,left join的CONDITION条件为maXXXX = claim_XXXX,执行计划为静态hash join
  • 子查询的结果为TT表,WHERE条件为TT.COXXXX <> TT.ACXXXX AND CAST(TT>TURXXXX AS DATE) <= CAST(‘2020-03-31’ AS DATE)
  • GROUP BY列为CLAXXXX, TURXXXX,包括了子查询tt的hash分布列CLAXXXXO,因此满足静态hash group by执行计划条件
  • Step04的MOTION RESULT意为将最终发送执行结果