执行计划_explain_analyse

如何产生执行计划?

预计执行计划      

explain select a.c_task_mc,b.c_mc from t_task a left join t_task_group b on a.c_task_lx = b.c_id

实际执行计划    

explain analyse select a.c_task_mc,b.c_mc from t_task a left join t_task_group b on a.c_task_lx = b.c_id

如何阅读执行计划?

postgres=# explain analyze select relname,attname from pg_class cl join pg_attribute att on cl.oid = att.attrelid; Hash Join  (cost=1586.32..12238.33 rows=208954 width=128) (actual time=27.980..188.542 rows=211272 loops=1)   Hash Cond: (att.attrelid = cl.oid)   ->  Seq Scan on pg_attribute att  (cost=0.00..5950.54 rows=208954 width=68) (actual time=0.009..57.759 rows=211272 loops=1)   ->  Hash  (cost=1188.92..1188.92 rows=31792 width=68) (actual time=27.932..27.932 rows=31045 loops=1)         Buckets: 4096  Batches: 1  Memory Usage: 3032kB         ->  Seq Scan on pg_class cl  (cost=0.00..1188.92 rows=31792 width=68) (actual time=0.013..13.183 rows=31045 loops=1) Total runtime: 200.296 ms

执行计划explain

explain select * from t_solution_task_his where c_task_mc = 'DEMO_执行sql工具'

执行计划_explain_analyse

执行计划_explain_analyse

节点解释

扫描操作

Seq Scan :全表扫描,从表的第一行开始顺序扫描,一直扫描到最后满足查询条件的记录

index Scan:索引扫描(读取索引块,然后读取数据文件)

Index Only Scan:索引只读扫描(只读取索引文件,根据映射文件获取数据)

Tid Scan:根据元组头中的ctid直接定位元祖的位置,读取数据文件,(page_number, item_number)

Bitmap Index Scan:位图索引扫描(利用索引,获得满足条件选择的元组的位图,直接读取索引文件,不读取数据)

BitMap Heap Scan:位图Heap索引扫描(利用Bitmap Index Scan得到的位图,获取元组,直接在数据文件中读取) Function Scan:函数扫描 ,处理范围表中有函数的情况(PostgreSQL允许函数可以返回元祖集合,类似表的元组集合)

SubQuery:子查询扫描

Values Scan :Values扫描(Postgresql提供了Values语句格式,允许Values链表可以返回元祖集合,类似表的元组集合)

CTE Scan:CTE扫描(select查询中用了With子句定义子查询,对With子句的扫描成为CTE扫描)

WorkTable Scan:工作表扫描(与RecursiveUnion结合共同完成递归合并子查询)

节点解释

表连接操作

Nested [(type)] Loop:嵌套循环连接。type可能是Inner,left,right,full,semi,anti。inner的可以显示省略

Merge[(type)] Join 归并连接。type同上

Hash[(type)] Join:哈希连接。type同上

物化操作 Material :物化操作(缓存子节点的结果,适用于需要多次扫描的节点)

Unique:distinct操作(对下层已经排序节点的输出去重)

Group:分组操作(Group By 对下层节点的输出分组)

Sort:排序操作(Order By对下层节点的输出排序)

Limit:limit/offset操作(从下层节点的输出中选出一定范围的元组)

Aggregate:带有聚集函数的Group By操作

GroupAggregate:分组聚集(带有分组操作的聚集,需要排序)

HashAggregate:Hash聚集(使用hash算法完成聚集,不需要排序)

WindwoAgg:窗口函数

节点解释

集合操作 Append:Union,intercect,except操作(多个子查询的结合操作)

SetOp[type]:intercect/except(需要排序)。type的值可能为:intersect,intersectAll,except,exceptAll。涉及All的操作需要去重。常以Append为输入节点

HashSetOp[type]:intercect/except(用hash算法完成不需要排序)。其他同上 控制类型 Result:一次性结果获取(如子查询可以在查询优化阶段获得结果,多以initplan作为输入)

ModifyTable:插入/修改/删除(inert/update/delete操作的sql) BitmapAnd:多个单独索引作为and操作符的左右操作数

BitmapOr:多个索引或一个索引的多个索引列作为or操作符的左右操作数

recursiveUnion:用于处理递归定义的union语句(与workTable Scan配合使用)

过滤器

filter:常规过滤(对元组按条件进行过滤,完成选择操作)

join filter:连接操作过滤(hashjoin,mergejoin,nestedloop join连接操作情况下使用过滤器)

One-Time:一趟过滤器(对于能一次性获得结果的Result操作,一趟过滤即可满足过滤要求)

节点解释

连接条件

Hash cond:显示hash连接的条件

merge cond:显示merge连接的条件

其他类型

Foreign Scan:外部表(对外部对象的访问)

LockRows:查询中带有For update/For share的操作,需要对被操作对象加锁

Remote SQL:配合Foreign Scan表示远程的sql

InitPlan:与Result配合,在初始化查询计划的阶段即可完成的操作

Rechck Cond:对条件重新进行检查 Output:表示输出信息

启动时间

执行计划_explain_analyse