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 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Douyin でログインしたデバイスを削除する手順を確認してください。 Douyin でログインしたデバイスを削除する手順を確認してください。 Mar 26, 2024 am 09:01 AM

1. まず、Douyin アプリをクリックして開き、[Me] をクリックします。 2. 右上隅にある三点アイコンをクリックします。 3. クリックして[設定]に入ります。 4. [アカウントとセキュリティ]をクリックして開きます。 5. [デバイス管理にログイン]を選択してクリックします。 6. 最後に、デバイスをクリックして選択し、[削除]をクリックします。

Xianyuで自分のIDを確認する方法_Xianyuで自分のニックネームを確認する方法の紹介 Xianyuで自分のIDを確認する方法_Xianyuで自分のニックネームを確認する方法の紹介 Mar 22, 2024 am 08:21 AM

Xianyu は取引プラットフォームなので、使用する前にアカウントに登録してログインする必要があります。ユーザーは自分のアカウントに ID 名を設定できます。自分の ID が何であるかを確認したい場合はどうすればよいですか?以下で一緒に調べてみましょう! Xianyuで個人のニックネームを表示する方法の紹介. まず、Xianyuアプリを起動し、ホームページに入ったら、アイドル販売、メッセージ販売、私のページに切り替えて、右下の[私の]オプションをクリックしてください。 2. 次に、マイページの左上隅にある [アバター] をクリックする必要があります; 2. 次に、個人のホームページ ページに移動すると、さまざまな情報が表示されます。ここで [情報の編集] ボタンをクリックする必要があります; 4.最後に、「後で情報を編集するページで確認できます」をクリックします。

NetEase Cloud Musicで音楽ランキングを確認する場所_NetEase Cloud Musicで音楽ランキングを確認する方法 NetEase Cloud Musicで音楽ランキングを確認する場所_NetEase Cloud Musicで音楽ランキングを確認する方法 Mar 25, 2024 am 11:40 AM

1. 電話の電源を入れた後、NetEase Cloud Music を選択します。 2. ホームページに入ると「ランキング一覧」が表示されますので、クリックしてエントリーしてください。 3. ランキングリストで任意のリストを選択し、[新しい曲リスト]をクリックします。 4. お気に入りの曲を選択してクリックします。 5. 前のページに戻って、さらにリストを表示します。

Kuaishou Live Companion ビデオのホットリストを表示する方法 Kuaishou Live Companion ビデオのホットリストを表示する方法 Mar 29, 2024 pm 08:09 PM

Kuaishou Live Companion は、強力なライブ ブロードキャスト補助ツールであるだけでなく、ブロードキャスター向けに作成されたホットなトピックやトレンドに関するリアルタイムの洞察プラットフォームでもあります。この機能により、アンカーは視聴者が最も関心のあるコンテンツを素早く捉え、視聴者の好みや興味に合わせてライブコンテンツを調整することができます。では、Kuaishou Live Companion アプリで人気のビデオ リストを確認するにはどうすればよいでしょうか? このチュートリアル ガイドでは、その手順について詳しく説明します。 Kuaishou Live Companion でホットビデオ リストを表示するにはどうすればよいですか? 2 番目のステップは、毎日のビデオ ホット リストをクリックすることです。 3 番目のステップは、毎日のビデオ ホット リストを確認することです。

WeChat に参加しているグループの数を確認する方法: 簡単なステップ WeChat に参加しているグループの数を確認する方法: 簡単なステップ Mar 26, 2024 am 10:06 AM

生活や仕事に関係なく、多くの人が長い間 WeChat と深く結びついており、いつでもさまざまなグループに引き込まれるでしょう。アドレス帳内のグループ チャットをすぐに表示したい場合がありますが、そこにはアドレス帳に保存した WeChat グループのみが表示され、他のグループは表示されません。あなたが参加しているすべての WeChat グループを確認したい場合は、非常に簡単です。WeChat ホームページの検索ボックスにニックネームを入力し、検索結果でグループ チャット セクションを見つけ、[その他のグループ チャット] をクリックして表示します。関連するすべてのグループ チャット情報。とにかくびっくりしました、その数は100以上で、右側のスクロールバーがとても小さくなってしまいました。残念ながら、具体的な数字の統計はありません...この方法は、参加している QQ グループを確認する場合にも適用できます。 PS: 一部のネチズンもトリックを提供しました。

自分が参加しているグループを確認するにはどうすればよいですか? 自分が参加しているグループを確認するにはどうすればよいですか? Apr 01, 2024 pm 05:34 PM

WeChat のグループ チャットは単なるチャット プラットフォームではなく、各界のエリートや熱心な友人が集まるコミュニケーション サークルでもあります。そこで今回は、WeChat に追加したグループの数を確認する方法と保存する方法を説明します。通常、WeChat を使用するユーザーは、これを見逃すことはできません。 WeChat に追加したグループの数を確認する方法とグループ チャットを保存する方法 WeChat に追加したグループの数を確認するには: 1. WeChat メイン インターフェイスでグループ チャット ウィンドウを表示できます。 2. すでに保存している場合は、グループ チャットでは、 [ アドレス帳] - [グループ チャット] をタップできます 3. グループ チャットに入ると、保存されたグループが表示されます. WeChat グループを保存します: 1. 保存したいグループを選択し、右上 [.. ] 2. チャット メッセージ内で開きます [アドレス帳に保存] 3. WeChat のメイン インターフェースで、[アドレス帳]-[グループ チャット] をタップして表示します。

Amap ヘルプセンターの表示方法_Amap ヘルプセンターの表示方法 Amap ヘルプセンターの表示方法_Amap ヘルプセンターの表示方法 Apr 01, 2024 pm 05:26 PM

1. まず Gaode マップを開きます。 2. 次に、Amap ホームページの右下隅にある (My) をクリックし、右上隅にある [設定] をクリックします。 3. 最後に、Amap のヘルプセンターが表示されます。

Huawei P70が直接Pioneer Planを開始し、正式に販売されます Huawei P70が直接Pioneer Planを開始し、正式に販売されます Apr 19, 2024 pm 01:58 PM

中関村ニュース:4月18日朝、ファーウェイは突然、P70シリーズの携帯電話がパイオニアプランに基づいて正式に販売されると発表した。購入したい友人は、過去の慣例に従って、行動を起こす準備ができている必要がある。非常に人気があり、常に在庫切れになります。今回、Huawei P70シリーズは、純粋を意味するPuraという名前に変更されました。ファーウェイのユー・チェンドン氏は以前、「2012年以来、ファーウェイのPシリーズスマートフォンは忠実なパートナーのようなもので、世界中の何億人ものユーザーとともに数え切れない貴重な時間を過ごし、人生の美しさと興奮を共に目撃してきた」と語った。彼は、ファーウェイのPシリーズを選択するすべてのユーザーから与えられる信頼と愛が強力な原動力に相当し、ファーウェイがイノベーションの道をしっかりと前進するよう常にインスピレーションを与えていると深く感じました。プラとは純粋という意味です。

See all articles