合 PG中的执行计划EXPLAIN介绍
EXPLAIN命令
常用语句
- 预生成执行计划
EXPLAIN sql
- 真实执行计划
EXPLAIN ANALYZE sql
- 输出详细内容
EXPLAIN (ANALYZE
on
, TIMING
on
, VERBOSE
on
, BUFFERS
on
, COSTS
on
) sql
语法
EXPLAIN [ ( option [, ...] ) ] statement EXPLAIN [ ANALYZE ] [ VERBOSE ] statemen
选项
- analyze:执行语句并显示真正的运行时间和其它统计信息,会真正执行SQL语句;
- verbose:显示额外的信息,尤其是计划树中每个节点的字段列表,schema识别表和函数名称。总是打印统计数据中显示的每个触发器的名字;
- costs:包括每个计划节点的启动成本预估和总成本的消耗,也包括行数和行宽度的预估;
- buffers:使用信息,特别包括共享块命中、读、脏和写的次数,本地块命中、读、脏和写,临时块读和写的次数;
- timing:在输出中包含实际启动时间和每个节点花费的时间,重复读系统块在某些系统上会显著的减缓查询的速度,只在ANALYZE也启用的时候使用;
- format:声明输出格式,可以为TEXT、XML、JSON 或 YAML,默认 text;
EXPLAIN 输出
1 | (cost=0.00..1555.49 rows=526 width=15) |
cost:这是查询执行的总代价。代价是通过估计查询执行所需的资源和时间来计算的,代价越低表示查询执行越高效。以点点“..”分为2个部分数字,第一个数字表示启动的成本,也就是返回第一行需要多少 cost 值;第二个数字表示返回所有的数据的成本。
0.00
: 这是查询执行的启始代价,也就是开始执行查询时的代价估计。1555.49
: 这是查询执行的总代价,表示执行整个查询所需的估计代价。默认 cost 值如下:
- 顺序扫描一个数据块,cost值定为1,参数为seq_page_cost
- 随机扫描一个数据块,cost值定为4,参数为random_page_cost
- 处理一个数据行的CPU,cost为0.01,参数为cpu_tuple_cost
- 处理一个索引行的CPU,cost为0.005,参数为cpu_index_tuple_cost
- 每个操作符的 CPU 代价为 0.0025,参数为cpu_operator_cost
rows:表示会返回多少行
width:表示每行平均宽度为多少字节,在这个例子中,每一行的宽度是 15 字节。
buffers
- shared hit:表示在共享内存中直接读到 xxx 个块,
- read:表示从磁盘读了 xxx 块
- written:写磁盘工 xxx 块
执行计划含义
Seq Scan:全表扫描,当数据表中没有索引,或者满足条件的数据集较大,索引扫描的成本高于全表扫描,这时规划器会选择使用全表扫描。
Index Scan:索引扫描,查询列有索引,则直接扫描索引,不再进行全表扫描,耗费时间小于顺序扫描。
本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!