1. 查看执行计划
执行计划的查看主要可以通过执行explain语句进行查看,kingbaseES还是通过管理工具或者查看日志进行查看,本文主要介绍explain方式查看执行计划。
EXPLAIN 查看
KingbaseES 中 explain 命令来查看执行计划时最常用的方式。其命令格式如下:
explain [option] statement
其中 option 为可选项,可以是以下 5 种情况的组合:
Ø analyze:执行命令并显示执行事件,真实的执行,默认 false
Ø verbose:显示附加信息,比如计划树中每个节点输出的字段名等,默认 false
Ø costs:显示执行计划的成本,默认 true
Ø buffers:显示缓冲区的使用信息,包括共享快、本地块和临时读写块,默认 false,前置条件是 analyze
Ø format:指定执行计划的输出格式,支持:TEXT、XML、JSON 或者 YAML,默认是 text
单纯使用 explain 查询得到的仅有预期的查询计划,并没有真正执行该语句,而运行 explain analyze 语句得到的执行计划则包含实际执行语句的 cost、时间等信息。
注:对于某些 DML 语句,如果即想运行 explain analyze 命令,又不想影响实际的数据,则可以把该命令放入一 个事务里,执行完后回滚事务:
begin; explain analyze update student set ssex=false where sname='ada'; rollback; |
2. 执行计划内容详解
执行计划内容
执行计划里每个节点主要内容包括:
• 执行动作,及其附加条件,比如索引扫描,索引条件等
• 估算成本:启动 cost、总体 cost
• 估计返回的行数和平均宽度
• 如果开启了 Analyze 选项,还会返回: – 实际成本:启动 cost、总体 cost – 实际返回的行数,节点循环执行次数
执行顺序
执行计划的结构是一颗计划结点的树,通常会有 0-2 个输入,特殊节点会有多个输入,大部分情况呈现出二叉树 的结构。 每一个计划节点对应于树中的一个节点,下层节点的输出作为上层节点输入。数据 (元组) 从底层节点向上层节 点流动,直至根节点,而根节点的输出即为整个査询的结果。 由此可见,査询计划树上的节点就构成了物理元组到执行结果的管道,因此査询计划树的执行过程可以看成是拉 动元组穿过管道的过程。KingbaseES 采用了一次一元组的执行模式,每个节点被执行一次仅向上层节点返回一条元 组。因此,对于整个査询计划树的执行也是一次一元组的模式。这种模式有很多的优点:
• 减少了返回元组的延迟。
• 对于某些操作 (例如游标、LIMIT 子句等) 不需要一次性获取所有的元组,节省了开销。
• 减少了实现过程中缓存结果带来的代码复杂性和执行过程中临时存储的开销。
计划节点
执行计划内部是树状结构,里面包含的节点主要有 5 类:扫描节点(Scan Node),连接节点(Join Node),物 化节点(Materialization Node),控制节点(Control Node),并行节点(Parallel Node),每类节点又包括具体的 节点:
1. 扫描节点:
Ø 顺序扫描(Seq scan)
Ø 索引扫描(Index scan)
Ø 位图扫描(Bitmap scan)
Ø TID 扫描(TID scan)
Ø 覆盖索引扫描(Index only scan)
2. 连接节点:
Ø 嵌套循环连接(NestLoop join)
Ø 哈希连接(Hash join)
Ø 归并连接(Merge join)
3. 物化节点:
Ø 物化节点(Material)
Ø 分组节点(Group)
Ø 排序节点(Sort)
Ø 去重节点(Unique)
4. 控制节点:
Ø Result 节点
Ø BitmapAnd/BitmapOr 节点
Ø Append 节点
Ø RecursiveUnion 节点
5. 并行节点:
Ø Gather/GatherMerge
Ø 并行全表扫描(Parallel SeqScan)
Ø 并行 hash(Parallel Hash)
Ø 并行连接(Parallel HashJoin/MergeJoin)
Ø 并行聚集(Partial/Finalize Aggregate/HashAggregate/GroupAggregate)
Ø 并行 Append(Parallel Append)
Ø 并行 UNION(Parallel UNION)