PostgreSql 执行计划的解释

本文解析了SQL查询的成本估算原理,包括顺序磁盘页面操作的基本成本、不同查询操作类型的启动时间和总执行时间,并提供了实例帮助理解如何解读explain命令的输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个顺序磁盘页面操作的cost值由系统参数seq_page_cost (floating point)参数指定的,由于这个参数默认为1.0,所以我们可以认为一次顺序磁盘页面操作的cost值为1。下面
osdba=# explain select * from t;
QUERY PLAN
———————————————————-
Seq Scan on t  (cost=0.00 ..4621.00  rows=300000  width=10 )
(1 row)

cost=说明:

  • 第一个数字0.00表示启动cost,这是执行到返回第一行时需要的cost值。
  • 第二个数字4621.00表示执行整个SQL的cost

可以explain后加analyze来通过真实执行这个SQL来获得真实的执行计划和执行时间:.

osdba=# EXPLAIN ANALYZE SELECT * FROM t;

                                                QUERY PLAN                                                 

-----------------------------------------------------------------------------------------------------------

 Seq Scan on t  (cost=0.00..4621.00 rows=300000 width=10) (actual time=0.022 ..355.380rows=300000 loops=1)

 Total runtime: 696.074 ms

actual time=中的第一个数字表示返回第一行需要的时间(叫启动时间),第二个数字表示执行这个整个花的时间。后面的rows=300000是实际的行数。

表顺序扫描由于是立即可以获得第一行,所以启动时间一般都是0,而如果是排序操作,则需要处理完所有行后才能返回第一行,所以排序操作是需要启动时间的,下表列出了哪些操作是需要启动时间的,哪些操作不是需要的:

执行计划运算类型操作说明是否有启动时间
Seq Scan扫描表无启动时间
Index Scan索引扫描无启动时间
Bitmap Index Scan索引扫描有启动时间
Bitmap Heap Scan索引扫描有启动时间
Subquery Scan子查询无启动时间
Tid Scanctid = …条件无启动时间
Function Scan函数扫描无启动时间
Nested Loop循环结合无启动时间
Merge Join合并结合有启动时间
Hash Join哈希结合有启动时间
Sort排序,ORDER BY操作有启动时间
Hash哈希运算有启动时间
Result函数扫描,和具体的表无关无启动时间
UniqueDISTINCT,UNION操作有启动时间
LimitLIMIT,OFFSET操作有启动时间
Aggregatecount, sum,avg, stddev集约函数有启动时间
GroupGROUP BY分组操作有启动时间
AppendUNION操作无启动时间
Materialize子查询有启动时间
SetOpINTERCECT,EXCEPT

有启动时

explain select distinct course_id from course where course_term = 'Fal02'; 
NOTICE:  QUERY PLAN: 
Unique  (cost=12223.09..12339.76 rows=4667 width=4) 
               -> Sort (cost=12223.09..12223.09 rows=46666 width=4) 
               ->  Seq Scan on course  (cost=0.00..8279.99 rows=46666 width=4)
1.从下往上读
2.explain报告查询的操作,开启的消耗,查询总的消耗,访问的行数 访问的平均宽度
3.开启时间消耗是输出开始前的时间例如排序的时间
4.消耗包括磁盘检索页,cpu时间 
5.注意,每一步的cost包括上一步的
6.重要的是,explain 不是真正的执行一次查询 只是得到查询执行的计划和估计的花费 
索引有用条件 当满足特定条件的元组数小于总的数目

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值