人大金仓 金仓数据库执行计划

112 阅读4分钟

关键字:

执行计划、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)和实际返回的行数(节点循环执行次数)。

如图给出了执行计划的示例:

file

观察示例可知,执行计划包括:执行动作、估算成本(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语句性能问题产生的原因,进而针对性的实施优化手段,分析执行计划的步骤如图所示:

file

首先需要查看当前慢语句的执行计划,并自上而下的阅读执行计划,理清层次结构,然后要对比统计信息是否准确,如果准确执行步骤4,如果不准确analyze相关表后从步骤1重新执行。最后要找出计划中耗时的节点,并分析耗时节点计划的合理性,可以从数据扫描是否可以走索引、分区、物化视图、多表连接的连接顺序是否合理、两表连接的连接算法是否合理、返回行数估算是否准确、是否有内存不够的情况5个方面进行分析。

在分析执行计划过程中,经常遇到的问题主要有:统计信息不够及时、缺少索引、分区等访问结构、多表连接的结果估算存在较大偏差、多表连接的算法或顺序不够好、存在物理读写IO的情况等。

执行计划在一些情况下会发生改变,以支持更好的性能表现,通过更改执行较慢语句的执行计划,可以缩短语句执行的时间。执行计划的更改可以是自动的,比如优化器对语句进行的统计信息收集,执行计划也可以是被强制修改的,可以考虑使用KingbaseES的HINT功能。

更多信息,参见help.kingbase.com.cn/v8/index.ht…