对PostgreSQL的执行计划的初步学习

开始

table 的状况:

[作者:技术者高健@博客园  mail: luckyjackgao@gmail.com ]

postgres=# analyze gaotab;
ANALYZE
postgres=# select a.relpages, a.reltuples, a.relfilenode,a.reltype,b.typname from pg_class a, pg_type b where a.relname like 'gaotab%' and a.reltype=b.oid;
 relpages | reltuples | relfilenode | reltype | typname 
----------+-----------+-------------+---------+---------
        1 |       100 |       16387 |   16386 | gaotab
(1 row)

成本参数:

复制代码
postgres=# show seq_page_cost;            
 seq_page_cost             
---------------            
1            
(1 row)            
            
postgres=# show cpu_tuple_cost;            
 cpu_tuple_cost             
----------------            
0.01            
(1 row)            
复制代码
postgres=# show cpu_operator_cost;            
 cpu_operator_cost             
-------------------            
0.0025            
(1 row)            

查询的代价:

postgres=# explain select * from gaotab;                    
                       QUERY PLAN                                            
---------------------------------------------------------                    
 Seq Scan on gaotab  (cost=0.00..2.00 rows=100 width=17)                    
(1 row)                    
                    
postgres=#                     

这么一个普通的查询所有记录的语句,具体执行的时候,首先要读取磁盘页面,然后是把每一条记录取出来。没有多余的运算。

所以,其计划类型为  Seq Scan,而其代价为:

relpages * seq_page_cost + reltuples * cpu_tuple_cost =1×1 + 100×0.01=2

再来:

postgres=# explain select * from gaotab where id=15;                    
                      QUERY PLAN                                           
-------------------------------------------------------                    
 Seq Scan on gaotab  (cost=0.00..2.25 rows=1 width=17)                    
   Filter: (id = 15)                    
(2 rows)                    

此时,由于有了一个 判断 id=15 的运算,成本还要高一些,此时用到了 cpu_operator_cost:

relpages * seq_page_cost + reltuples * cpu_tuple_cost + reltuples* cpu_operator_cost

=1*1+100*0.01+100*0.0025=2.25

[作者:技术者高健@博客园  mail: luckyjackgao@gmail.com ]

结束

posted @   健哥的数据花园  阅读(1511)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示