关键字:
执行计划、EXPLAIN、执行顺序、计划节点
1.查看执行计划
KingbaseES数据库中存在多种查看执行计划的方式,常用的主要有三种,下表给出了这三种执行计划的特点以及适用的场景:
| 查看方式 | 特点 |
|---|---|
| 使用explain命令查看 | 可查看指定SQL语句在当前session下的执行计划,调试方便 |
| 使用对象管理工具查看 | |
| 使用auto_explain查看 | 可记录所有后台SQL语句的执行计划:ksql、jdbc等 |
最常用的是“使用explain命令查看执行计划”这种方式
EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement
where option can be one of:
ANALYZE [ boolean ]
VERBOSE [ boolean ]
COSTS [ boolean ]
SETTINGS [ boolean ]
BUFFERS [ boolean ]
TIMING [ boolean ]
SUMMARY [ boolean ]
FORMAT { TEXT | XML | JSON | YAML }
其命令格式:explain [option] statement,其中option:
analyze:执行命令并显示执行事件,默认false
verbose:显示附加信息,比如计划树中每个节点输出的字段名等,默认false
costs:显示执行计划的成本,默认true
buffers:显示缓冲区的使用信息,包括共享快、本地块和临时读写块,默认false,前置条件是analyze
format:指定执行计划的输出格式,支持:TEXT、XML、JSON或者YAML,默认是text
2.阅读执行计划
执行计划里每个节点主要内容包括:
(1)执行动作,及其附加条件,比如索引扫描,索引条件等
(2)估算成本:启动cost、总体cost
(3)估计返回的行数和平均宽度
(4)如果开启了Analyze选项,还会返回:实际成本(启动cost、总体cost)和实际返回的行数(节点循环执行次数)。
如图给出了执行计划的示例:
观察示例可知,执行计划包括:执行动作、估算成本(cost)、实际成本(actual time、rows、loops)、 索引条件、计划和执行时间5部分内容,其中,实际成本以及计划和执行时间为带有analyze的explain语句特有。
执行计划中有一个非常重要知识,那就是计划节点。执行计划内部是树状结构,里面包含的节点主要有5类:扫描节点(Scan Node),连接节点(Join Node),物化节点(Materialization Node),控制节点(Control Node),并行节点(Parallel Node),每类节点又包括具体的节点:
| 节点类型 | 具体分类 | |
|---|---|---|
| 扫描节点 | 顺序扫描(Seq scan) | |
| 索引扫描(Index scan) | ||
| 位图扫描(Bitmap scan) | ||
| TID扫描(TID scan) | ||
| 覆盖索引扫描(Index only scan) | ||
| 连接节点 | 嵌套循环连接(NestLoop join) | |
| 哈希连接(Hash join) | ||
| 归并连接(Merge join) | ||
| 物化节点 | 物化节点(Material) | |
| 分组节点(Group) | ||
| 排序节点(Sort) | ||
| 去重节点(Unique) | ||
| 控制节点 | Result节点 | |
| BitmapAnd/BitmapOr节点 | ||
| Append节点 | ||
| RecursiveUnion节点 | ||
| 并行节点 | Gather/GatherMerge | |
| 并行全表扫描(Parallel SeqScan) | ||
| 并行hash(Parallel Hash) | ||
| 并行连接(Parallel HashJoin/MergeJoin) | ||
| 并行聚集 | ||
| 并行Append(Parallel Append) | ||
| 并行UNION(Parallel UNION) |
3.分析执行计划
分析执行计划是SQL性能调优需要掌握的一项重要能力,可以帮助用户定位SQL语句性能问题产生的原因,进而针对性的实施优化手段,分析执行计划的步骤如图所示:
首先需要查看当前慢语句的执行计划,并自上而下的阅读执行计划,理清层次结构,然后要对比统计信息是否准确,如果准确执行步骤4,如果不准确analyze相关表后从步骤1重新执行。最后要找出计划中耗时的节点,并分析耗时节点计划的合理性,可以从数据扫描是否可以走索引、分区、物化视图、多表连接的连接顺序是否合理、两表连接的连接算法是否合理、返回行数估算是否准确、是否有内存不够的情况5个方面进行分析。
在分析执行计划过程中,经常遇到的问题主要有:统计信息不够及时、缺少索引、分区等访问结构、多表连接的结果估算存在较大偏差、多表连接的算法或顺序不够好、存在物理读写IO的情况等。
执行计划在一些情况下会发生改变,以支持更好的性能表现,通过更改执行较慢语句的执行计划,可以缩短语句执行的时间。执行计划的更改可以是自动的,比如优化器对语句进行的统计信息收集,执行计划也可以是被强制修改的,可以考虑使用KingbaseES的HINT功能。