执行计划_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工具'
节点解释
扫描操作
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:表示输出信息
启动时间