查看执行计划
常用的几种执行计划查
看方式。
使用 EXPLAIN 命令查看
使用对象管理工具查看
在运行日志中查看
4.1.1 使用 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;
4.1.3 在日志记录中查看
提供了插件 auto_explain,用于在日志中自动记录慢速语句的执行计划
根据作用范围不同,auto_explain 有以下两种方式:
作用于当前会话
LOAD’auto_explain’;(必须是超级用户才能这样做)
作用于全局
设置 kingbase.conf 中的 shared_preload_libraries 参数为‘auto_explain’
4.2 阅读执行计划
4.2.1 主要内容
执行计划里每个节点主要内容包括:
执行动作,及其附加条件,比如索引扫描,索引条件等
估算成本:启动 cost、总体 cost
估计返回的行数和平均宽度
如果开启了 Analyze 选项,还会返回:
– 实际成本:启动 cost、总体 cost
– 实际返回的行数,节点循环执行次数
我们以下例来说明,执行计划输出结果各部分的内容:
explain analyze select * from student where sname='ada';
QUERY PLAN
---------------------------------------------------------------
Index Scan using idx_stu on student (cost=0.14..8.15 rows=1 width=10)(actual time=0.074..0.074 rows=0 loops=1)
Index Cond: (sname = 'ada'::text)
Planning Time: 0.122 ms
Execution Time: 0.245 ms
(4 行记录)
1. 执行动作:Index Scan using idx_stu on student
Index Scan:表示索引扫描
Idx_stu:使用的索引名
Student:访问的表名
整句话表示:访问 student 表的时候,使用的是索引扫描,扫描的索引是 idx_stu。
2. 估算成本:(cost=0.14..8.15 rows=1 width=10)
Cost=0.14..81.5:第一个数 0.14 表示启动成本,也就是说返回第一行需要多少 cost。第二个数值
81.5 表示返回所有的数据的成本。这两个数值用.. 分开。
Rows=1:表示该查询会返回 1 行记录。
Width=10:表示每行平均宽度为 10 字节。
需要注意的是:在执行计划里,每一步的 cost 值都传给了上一层,也就是说每一个 cost 值代表的是在此步以下所有操作的代价总和。启动成本是第一行输出开始前的成本,比如进行排序的成本。
3. 实际成本:(actual time=0.074..0.074 rows=0 loops=1)
Actural time=0.074..0.074:表示实际的启动时间为 0.074,实际的运行时间也为 0.074。
Rows=0:表示实际查询返回了 0 行记录(没有查询到)。
Loops=1:表示该索引扫描只执行了 1 次。
这行信息为带有 Analyze 的 explain 语句特有。可以看出实际成本跟估算成本会有一定的偏差。那是因为估算成本是优化器根据统计信息估算出来的一个结果,而有时统计信息并不完全能够反映真实的情况。
为了让统计信息更准确,可以运行 Analyze 命令来更新整个数据库、某张表或者某个字段的统计信息,然后再次执行 explain 将得到一个更好的结果。
4. 索引条件:Index Cond: (sname = ’ada’::text)
该句表示当前执行的索引扫描(Index Scan)使用的索引条件为:sname = ’ada’::text
5. 计划和执行时间:Planning Time: 0.122 ms, Execution Time: 0.245 ms
这行信息为带有 Analyze 的 explain 语句特有。表示生成执行计划用时 0.122ms,真正执行查询用时 0.245ms。