首頁 資料庫 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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 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)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
抖音查看刪除登入裝置的操作步驟 抖音查看刪除登入裝置的操作步驟 Mar 26, 2024 am 09:01 AM

1.先點選開啟抖音app,點選【我】。 2.點選右上方三點的圖示。 3.點選進入【設定】。 4.點選開啟【帳號與安全】。 5.選擇點選【登入設備管理】。 6.最後點選選擇其中的設備,點選【移除】即可。

網易雲音樂在哪裡查看音樂排行榜_網易雲音樂查看音樂排行榜方法 網易雲音樂在哪裡查看音樂排行榜_網易雲音樂查看音樂排行榜方法 Mar 25, 2024 am 11:40 AM

1.打開手機後,選擇網路易雲音樂。 2.進入首頁後,大家就可以看到【排行榜】,點選進入。 3.在排行榜中,可以選擇任意榜單,點選【新歌榜】。 4、選擇自己喜歡的歌曲,並進行點擊。 5.返回上一頁,可以看到更多的榜單。

快手直播伴侶影片熱榜怎麼看 快手直播伴侶影片熱榜怎麼看 Mar 29, 2024 pm 08:09 PM

快手直播伴侶不僅是一個強大的直播輔助工具,更是一個為主播們打造的即時熱門話題和趨勢的洞察平台。透過這個功能,主播可以快速捕捉觀眾目前最關注的內容,進而調整直播內容,使其更符合觀眾的品味和興趣。那麼在快手直播伴侶app中如何查看影片熱榜呢,這篇教學攻略就將為大家帶來詳細的步驟介紹,希望能幫助到大家。快手直播伴侶怎麼看影片熱榜第二步,點選每日影片熱榜。第三步,即可查看每日影片熱榜了。

閒魚怎麼查看自己的id_閒魚個人暱稱查看方法介紹 閒魚怎麼查看自己的id_閒魚個人暱稱查看方法介紹 Mar 22, 2024 am 08:21 AM

閒魚作為交易平台,使用前都需要先註冊和登入自己的帳號,用戶可以為自己的帳號設定id名稱,如果想查看自己的id是什麼怎麼辦呢?下面就來一起了解吧!閒魚個人暱稱檢視方法介紹先啟動閒魚應用,進入首頁後,透過切換到賣閒置、訊息、我的頁面,點選右下角的【我的】選項。 2、然後在我的頁面中我們需要點擊左上角的【頭像】;2、接著來到個人主頁的頁面中可以看到不同的信息,我們需要在這裡點擊【編輯資料】按鈕;4、最後點擊過後在編輯資料的頁面中我們就可以看到了;

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

無論生活或工作,很多人早已被微信深深捆綁,隨時會被拉入各種各樣的群,那麼你到底加入了多少微信群呢?你可能會立刻想要查看通訊錄中的群聊,但只有你保存在通訊錄中的微信群才會顯示在那裡,其他群是不可見的。想看自己加入的所有微信群,也非常簡單:在微信首頁搜尋框輸入您的暱稱,然後在搜尋結果中找到群組聊天部分,點擊「更多群組聊天」即可查看所有相關群組聊天資訊。反正我是被嚇了一跳,密密麻麻上百個都不止,右側滾動條都變得很小了。只可惜,沒有具體數量統計…這個方法也同樣適用於查看加入的QQ群。 PS:還有網友提供了一招,

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

微信群組聊天這裡不僅是一個簡單的聊天平台,更是一個匯集了各行各業精英和熱心朋友的交流圈,所以小編今天就來教大家微信看自己加了多少群及保存群聊方法,平時使用微信的用戶可千萬不要錯過了喲。微信看自己加了多少群及保存群聊方法微信查看自己加了多少群:1.您可在微信主界面中查看你的群聊窗口2.若您已經操作保存群聊,您可輕觸【通訊錄】-【群組聊天】3.群組進入後即可查看到已儲存的群組裡啦保存微信群組:1.選擇您需儲存的群組裡,右上方【...】2.聊天訊息中打開【儲存到通訊錄】3.微信主介面,輕觸【通訊錄】-【群組聊天】即可查看

華為 P70 直接開啟先鋒計畫 正式開售 華為 P70 直接開啟先鋒計畫 正式開售 Apr 19, 2024 pm 01:58 PM

中關村消息:4月18日早上,華為突然宣布P70系列手機開啟先鋒計畫正式開售,想要購買的朋友要準備行動起來了,按照以往慣例,華為的旗艦手機非常搶手,會一直處於缺貨狀態。這次華為P70系列改名為Pura,意為純粹。在此前華為餘承東表示:自2012年起,華為P系列智慧型手機便如同忠實的伙伴,伴隨全球億萬用戶度過了無數珍貴時刻,共同見證了生活中的美好與精彩紛呈。他深刻感悟,每位選擇華為P系列的用戶所給予的信任與熱愛,無異於一股強大的推動力,始終鼓舞著華為在創新之路上堅定前行。 Pura的意思是純粹的。

高德地圖幫助中心怎麼查看_高德地圖幫助中心查看方法 高德地圖幫助中心怎麼查看_高德地圖幫助中心查看方法 Apr 01, 2024 pm 05:26 PM

1、我們先打開高德地圖。 2、然後在高德地圖的主頁中點選右下角的(我的)隨後點選右上角的設定。 3.最後這樣就可以看到高德地圖的幫助中心了。

See all articles