首页 数据库 mysql教程 PostgreSQL的执行计划分析

PostgreSQL的执行计划分析

Jun 07, 2016 pm 05:58 PM
p postgresql 分析 执行 查看 计划

期有人提出想查看Postgresql的执行计划,下面分析下PG执行计划中的cost等相关值是怎么计算出来的: PG的版本是9.1.2 1.终端工具PGADMIN,对执行的语句按F7即可,然后看数据输出和解释 2.命令行分析:explain select * from table_name; 一般我们会比较关注消耗

期有人提出想查看Postgresql的执行计划,下面分析下PG执行计划中的cost等相关值是怎么计算出来的:
PG的版本是9.1.2
 
1.终端工具PGADMIN,对执行的语句按F7即可,然后看数据输出和解释



2.命令行分析:explain select * from table_name;

一般我们会比较关注消耗值cost和扫描的方式,如走索引或者full scan全表扫描.当COST值消耗比较大时需要注意是否有优化的可能。
与执行计划相关的几个参数,参看下面的示例:
kenyon=# select count(1) from dba.website ;                    --普通堆栈表,无任何索引约束
count
-------
    20
(1 row)

kenyon=# explain select * from dba.website ;
                       QUERY PLAN                     
--------------------------------------------------------
Seq Scan on website  (cost=0.00..1.20 rows=20 width=4)
(1 row)

--relpages磁盘页,reltuples是行数(与实际不一定相符,一般略小)
kenyon=# select relpages,reltuples from pg_class where relname = 'website';
relpages | reltuples
----------+-----------
        1 |        20
(1 row)

kenyon=# select 1*1+20*0.01;                                                                   
--cost = relpages * seq_page_cost + reltuples * cpu_tuple_cost
?column?
----------
     1.20
(1 row)

kenyon=# show cpu_tuple_cost ;
cpu_tuple_cost
----------------
0.01
(1 row)

kenyon=# show seq_page_cost;
seq_page_cost
---------------
1
(1 row)


--加限制条件的执行计划

kenyon=# select count(1) from dba.website where hits >15;
count
-------
     5
(1 row)

kenyon=# explain select * from dba.website where hits >15;
                      QUERY PLAN                     
-------------------------------------------------------
Seq Scan on website  (cost=0.00..1.25 rows=5 width=4)
   Filter: (hits > 15)
(2 rows)

kenyon=# show cpu_operator_cost ;
cpu_operator_cost
-------------------
0.0025
(1 row)

因为扫描的总数是20行,不变的,所以COST不会下降,相反反而增加了0.05,这是因为额外消耗了CPU的时间去检查符合约束条件数据,即cost 在原来的基础上再增加 20 * 0.0025 = 0.05  (reltuples * cpu_operator_cost)


--加索引的执行计划
kenyon=# select count(1) from dba.website_2 ;
count
-------
  8000
(1 row)

kenyon=# explain select * from dba.website_2 ;
                          QUERY PLAN                        
--------------------------------------------------------------
Seq Scan on website_2  (cost=0.00..112.00 rows=8000 width=4)
(1 row)

kenyon=# select relpages,reltuples from pg_class where relname = 'website_2';
relpages | reltuples
----------+-----------
       32 |      8000
(1 row)

kenyon=# explain select * from dba.website_2 where hits >7900;  --走的索引
                                    QUERY PLAN                                  
----------------------------------------------------------------------------------
Index Scan using ind_website_2 on website_2  (cost=0.00..10.00 rows=100 width=4)
   Index Cond: (hits > 7900)
(2 rows)
()
kenyon=# explain select * from dba.website_2 where hits >10;    --未走索引(不满足索引条件,full scan)
                          QUERY PLAN                        
--------------------------------------------------------------
Seq Scan on website_2  (cost=0.00..132.00 rows=7991 width=4)   -- 132 = 112+8000*0.0025
   Filter: (hits > 10)
(2 rows)


虽然读取的COST更大,但是因为索引的缘故,访问的数据量变小了,所以总体COST是下降的。
--多表JOIN的执行计划 示例: 若想看实际的一个执行时间,可以加上 analyze 参数
kenyon=# explain analyze select * from dba.website a ,dba.website_2 b where a.hits = b.hits and a.hits >18;
                                             QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------
Merge Join (cost=1.26..1.90 rows=2 width=8) (actual time=0.070..0.075 rows=2 loops=1)
  Merge Cond: (b.hits = a.hits)
  -> Index Scan using ind_website_2 on website_2 b (cost=0.00..235.25 rows=8000 width=4) (actual time=0.013..0.020 rows=21 loops=1)
  -> Sort (cost=1.26..1.26 rows=2 width=4) (actual time=0.035..0.037 rows=2 loops=1)
     Sort Key: a.hits
     Sort Method: quicksort Memory: 17kB
     -> Seq Scan on website a (cost=0.00..1.25 rows=2 width=4) (actual time=0.009..0.011 rows=2 loops=1)
      Filter: (hits > 18)
Total runtime : 0.120 ms
(9 rows)
total runtime 是执行器启动和关闭的时间,但不包括解析,重写和规划的时间
注意: pg_class中的relpages,reltuples数据不是实时更新的,一般在vacuum analyze和少部分DDL(如建立索引)后更新。
示例1:
kenyon=# insert into dba.website select generate_series(8000,9000);
INSERT 0 1001
kenyon=# select relpages,reltuples,relname,relkind from pg_class where relname like '%website%';
relpages | reltuples |    relname    | relkind
----------+-----------+---------------+---------
        1 |        20 | website       | r
       32 |      8000 | website_2     | r
       20 |      8000 | ind_website_2 | i
(3 rows)

kenyon=# vacuum analyze dba.website;
VACUUM
kenyon=# vacuum analyze dba.website;
VACUUM
kenyon=# select relpages,reltuples,relname,relkind from pg_class where relname like '%website%';
relpages | reltuples |    relname    | relkind
----------+-----------+---------------+---------
        5 |      1021 | website       | r
       36 |      8999 | website_2     | r
       22 |      8999 | ind_website_2 | i
(3 rows)
示例2:
kenyon=# insert into dba.website select generate_series(8000,9000);
INSERT 0 1001
kenyon=# select relpages,reltuples,relname,relkind from pg_class where relname like '%website%';
relpages | reltuples |    relname    | relkind
----------+-----------+---------------+---------
        1 |        21 | website       | r
       36 |      8999 | website_2     | r
       22 |      8999 | ind_website_2 | i
(3 rows)

kenyon=# create index ind_website on dba.website(hits);
CREATE INDEX
kenyon=# select relpages,reltuples,relname,relkind from pg_class where relname like '%website%';
relpages | reltuples |    relname    | relkind
----------+-----------+---------------+---------
        5 |      1022 | website       | r
       36 |      8999 | website_2     | r
       22 |      8999 | ind_website_2 | i
        5 |      1022 | ind_website   | i
(4 rows)
所涉及的系统表:
pg_stats
pg_statistic
pg_class
pg_stat是任何人都可以看的,而且可读性高,比较直观,pg_statistic只有superuser才能读,并且可读性差,普通人员建议看pg_stats,pg_stats是pg_statistic的视图。 这两个表也不是实时更新的,需要vacuum analyze时会更新
所涉及的系统变量:
default_statistics_target
geqo_threshold
join_collapse_limit
from_collapse_limit
kenyon=# show default_statistics_target ;
default_statistics_target
---------------------------
100
(1 row)

kenyon=# show geqo_threshold ;         --这个参数的大小会设置执行计划从穷举搜索到概率选择性搜索的临界值
geqo_threshold
----------------
12
(1 row)

kenyon=# show join_collapse_limit ;    --join连接走执行计划上限
join_collapse_limit
---------------------
8
(1 row)

kenyon=# show from_collapse_limit ;
from_collapse_limit
---------------------
8
(1 row)
EXPLAIN
Name
EXPLAIN— show the execution plan of a statement
Synopsis
EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement
where option can be one of:
   ANALYZE [ boolean ]
   VERBOSE [ boolean ]
   COSTS [ boolean ]
   BUFFERS [ boolean ]
   FORMAT { TEXT | XML | JSON | YAML }

例子:
kenyon=# explain (analyze,verbose,costs,buffers) select id from dba.test222 order by id desc limit 1;
                                                          QUERY PLAN                                                        
------------------------------------------------------------------------------------------------------------------------------
Limit  (cost=1807.80..1807.80 rows=1 width=4) (actual time=87.167..87.168 rows=1 loops=1)
   Output: id
   Buffers: shared hit=393
   ->  Sort  (cost=1807.80..2043.60 rows=94320 width=4) (actual time=87.165..87.165 rows=1 loops=1)
         Output: id
         Sort Key: test222.id
         Sort Method: top-N heapsort  Memory: 17kB
         Buffers: shared hit=393
         ->  Seq Scan on dba.test222  (cost=0.00..1336.20 rows=94320 width=4) (actual time=0.036..42.847 rows=100000 loops=1)
               Output: id
               Buffers: shared hit=393
Total runtime: 87.183 ms
(12 rows)

kenyon=# explain (analyze,verbose,costs,buffers) select max(id) from dba.test222;
                                                       QUERY PLAN                                                     
------------------------------------------------------------------------------------------------------------------------
Aggregate  (cost=1572.00..1572.01 rows=1 width=4) (actual time=77.679..77.680 rows=1 loops=1)
   Output: max(id)
   Buffers: shared hit=393
   ->  Seq Scan on dba.test222  (cost=0.00..1336.20 rows=94320 width=4) (actual time=0.012..36.908 rows=100000 loops=1)
         Output: id
         Buffers: shared hit=393
Total runtime: 77.701 ms
(7 rows)
explain参数解释:
ANALYZE :执行命令并显示执行事件,默认false
VERBOSE :对执行计划提供额外的信息,如查询字段信息等,默认false
COSTS :显示执行计划的,默认true
BUFFERS :默认false,前置条件是analyze
FORMAT :默认格式是text 
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

抖音查看删除登录设备的操作步骤 抖音查看删除登录设备的操作步骤 Mar 26, 2024 am 09:01 AM

1、首先点击打开抖音app,点击【我】。2、点击右上方三点的图标。3、点击进入【设置】。4、点击打开【帐号与安全】。5、选择点击【登录设备管理】。6、最后点击选择其中的设备,点击【移除】即可。

闲鱼怎么查看自己的id_闲鱼个人昵称查看方法介绍 闲鱼怎么查看自己的id_闲鱼个人昵称查看方法介绍 Mar 22, 2024 am 08:21 AM

闲鱼作为一款交易平台,使用之前都需要先注册和登录自己的账号,用户可以为自己的账号设置id名称,如果想查看自己的id是什么怎么办呢?下面就来一起了解一下吧!闲鱼个人昵称查看方法介绍首先启动闲鱼应用,进入首页后,通过切换到卖闲置、消息、我的页面,点击右下角的【我的】选项。2、然后在我的页面中我们需要点击左上角的【头像】;2、接着来到个人主页的页面中可以看到不同的信息,我们需要在这里点击【编辑资料】按钮;4、最后点击过后在编辑资料的页面中我们就可以看到了;

网易云音乐在哪查看音乐排行榜_网易云音乐查看音乐排行榜方法 网易云音乐在哪查看音乐排行榜_网易云音乐查看音乐排行榜方法 Mar 25, 2024 am 11:40 AM

1、打开手机后,选择网易云音乐。2、进入到首页后,大家就可以看到【排行榜】,点击进入。3、在排行榜中,可以选择任意榜单,点击【新歌榜】。4、选择自己喜欢的歌曲,并进行点击。5、返回上一页,可以看到更多的榜单。

快手直播伴侣视频热榜怎么看 快手直播伴侣视频热榜怎么看 Mar 29, 2024 pm 08:09 PM

快手直播伴侣不仅是一个强大的直播辅助工具,更是一个为主播们打造的实时热门话题和趋势的洞察平台。通过这个功能,主播们可以迅速捕捉观众当前最关注的内容,进而调整直播内容,使其更加符合观众的口味和兴趣。那么在快手直播伴侣app中如何查看视频热榜呢,这篇教程攻略就将为大家带来详细的步骤介绍,希望能帮助到大家。快手直播伴侣怎么看视频热榜第二步,点击每日视频热榜。第三步,即可查看每日视频热榜了。

怎么查看自己进了哪些群 怎么查看自己进了哪些群 Apr 01, 2024 pm 05:34 PM

微信群聊这里不仅是一个简单的聊天平台,更是一个汇聚了各行各业精英和热心朋友的交流圈,所以小编今天就来教大家微信看自己加了多少群及保存群聊方法,平时使用微信的用户可千万不要错过了哟。微信看自己加了多少群及保存群聊方法微信查看自己加了多少群:1.您可在微信主界面中查看你的群聊窗口2.若您已经操作保存群聊,您可轻触【通讯录】-【群聊】3.群聊进入后即可查看到保存的群里啦保存微信群:1.选择您需保存的群里,右上方【...】2.聊天信息中打开【保存到通讯录】3.微信主界面,轻触【通讯录】-【群聊】即可查看

微信如何查看自己加了多少群:简单一步 微信如何查看自己加了多少群:简单一步 Mar 26, 2024 am 10:06 AM

无论生活还是工作,很多人早已被微信深深捆绑,也随时会被拉入各种各样的群,那么你到底加入了多少微信群呢?你可能会立刻想要查看通讯录中的群聊,但只有你保存在通讯录中的微信群才会显示在那里,其他群是不可见的。想看自己加入的所有微信群,也非常简单:在微信首页搜索框输入您的昵称,然后在搜索结果中找到群聊部分,点击“更多群聊”即可查看所有相关群聊信息。反正我是被吓了一跳,密密麻麻上百个都不止,右侧滚动条都变得很小了。只可惜,没有具体数量统计……这个方法也同样适用于查看加入的QQ群。PS:还有网友提供了一招,

高德地图帮助中心怎么查看_高德地图帮助中心查看方法 高德地图帮助中心怎么查看_高德地图帮助中心查看方法 Apr 01, 2024 pm 05:26 PM

1、我们首先打开高德地图。2、然后在高德地图的主页中点击右下角的(我的)随后点击右上角的设置。3、最后这样就可以看到高德地图的帮助中心了。

华为 P70 直接开启先锋计划 正式开售 华为 P70 直接开启先锋计划 正式开售 Apr 19, 2024 pm 01:58 PM

中关村消息:4月18日早上,华为突然宣布P70系列手机开启先锋计划正式开售,想要购买的朋友要准备行动起来了,按照以往惯例,华为的旗舰手机非常抢手,会一直处于缺货状态。这次华为P70系列改名为Pura,意为纯粹。在此前华为余承东表示:自2012年起,华为P系列智能手机便如同忠实实的伙伴,伴随全球亿万用户度过了无数珍贵时刻,共同见证了生活中的美好与精彩纷呈。他深刻感悟,每一位选择华为P系列的用户所给予的信任与热爱,无异于一股强大的推动力,始终鼓舞着华为在创新之路上坚定前行。Pura的意思是纯粹的。

See all articles