Maison base de données tutoriel 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 
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Découvrez les étapes pour supprimer un appareil connecté sur Douyin Découvrez les étapes pour supprimer un appareil connecté sur Douyin Mar 26, 2024 am 09:01 AM

1. Tout d'abord, cliquez pour ouvrir l'application Douyin et cliquez sur [Moi]. 2. Cliquez sur l'icône à trois points dans le coin supérieur droit. 3. Cliquez pour accéder aux [Paramètres]. 4. Cliquez pour ouvrir [Compte et sécurité]. 5. Sélectionnez et cliquez sur [Connexion à la gestion des appareils]. 6. Enfin, cliquez pour sélectionner le périphérique et cliquez sur [Supprimer].

Comment vérifier votre propre identifiant sur Xianyu_Introduction à la façon de vérifier votre pseudo personnel sur Xianyu Comment vérifier votre propre identifiant sur Xianyu_Introduction à la façon de vérifier votre pseudo personnel sur Xianyu Mar 22, 2024 am 08:21 AM

En tant que plateforme de trading, Xianyu vous demande de vous inscrire et de vous connecter à votre compte avant de l'utiliser. Les utilisateurs peuvent définir un nom d'identification pour leur compte. Et s'ils souhaitent vérifier quel est leur identifiant ? Découvrons ensemble ci-dessous ! Une introduction à la façon de vérifier votre pseudo personnel sur Xianyu. Tout d'abord, démarrez l'application Xianyu. Après être entré sur la page d'accueil, passez à la page de vente d'inactivité, de messages et de moi, et cliquez sur l'option [Mon] dans le coin inférieur droit. 2. Ensuite, sur ma page, nous devons cliquer sur [Avatar] dans le coin supérieur gauche ; 2. Ensuite, lorsque nous accédons à la page d'accueil personnelle, nous pouvons voir différentes informations. Nous devons cliquer sur le bouton [Modifier les informations] ici ; 4. Enfin, cliquez sur Nous pourrons le voir plus tard sur la page où nous modifions les informations ;

Où vérifier les classements musicaux sur NetEase Cloud Music_Comment vérifier les classements musicaux sur NetEase Cloud Music Où vérifier les classements musicaux sur NetEase Cloud Music_Comment vérifier les classements musicaux sur NetEase Cloud Music Mar 25, 2024 am 11:40 AM

1. Après avoir allumé le téléphone, sélectionnez NetEase Cloud Music. 2. Après avoir accédé à la page d'accueil, vous pouvez voir la [Liste de classement] et cliquer pour entrer. 3. Dans la liste de classement, vous pouvez sélectionner n'importe quelle liste et cliquer sur [Nouvelle liste de chansons]. 4. Sélectionnez votre chanson préférée et cliquez dessus. 5. Revenez à la page précédente pour voir plus de listes.

Comment afficher la liste chaude des vidéos Kuaishou Live Companion Comment afficher la liste chaude des vidéos Kuaishou Live Companion Mar 29, 2024 pm 08:09 PM

Kuaishou Live Companion n'est pas seulement un puissant outil auxiliaire de diffusion en direct, mais également une plate-forme d'informations en temps réel sur les sujets d'actualité et les tendances créées pour les diffuseurs. Grâce à cette fonction, les présentateurs peuvent rapidement capturer le contenu qui préoccupe le plus le public, puis ajuster le contenu en direct pour le rendre plus conforme aux goûts et aux intérêts du public. Alors, comment vérifier la liste des vidéos populaires dans l'application Kuaishou Live Companion ? Ce guide didacticiel vous fournira une introduction détaillée aux étapes. J'espère qu'il pourra vous aider. Comment afficher la liste des vidéos chaudes sur Kuaishou Live Companion ? La deuxième étape consiste à cliquer sur la liste des vidéos chaudes quotidiennes. La troisième étape consiste à consulter la liste des vidéos préférées quotidiennes.

Comment vérifier les groupes que j'ai rejoints Comment vérifier les groupes que j'ai rejoints Apr 01, 2024 pm 05:34 PM

Le chat de groupe WeChat n'est pas seulement une simple plateforme de chat, mais aussi un cercle de communication qui rassemble des élites et des amis enthousiastes de tous horizons. Aujourd'hui, je vais donc vous apprendre à vérifier le nombre de groupes que vous avez ajoutés sur WeChat et à les enregistrer. discussions de groupe. Habituellement, les utilisateurs qui utilisent WeChat ne doivent pas le manquer. Comment vérifier le nombre de groupes que vous avez ajoutés à WeChat et comment enregistrer les discussions de groupe Pour vérifier le nombre de groupes que vous avez ajoutés à WeChat : 1. Vous pouvez afficher la fenêtre de votre discussion de groupe dans l'interface principale de WeChat 2. Si vous avez déjà enregistré le discussion de groupe, vous pouvez appuyer sur [ Carnet d'adresses] - [Chat de groupe] 3. Après avoir accédé à la discussion de groupe, vous pouvez afficher le groupe enregistré. Enregistrez le groupe WeChat : 1. Sélectionnez le groupe que vous souhaitez enregistrer, en haut à droite [.. .] 2. Ouvrez dans le message de discussion [Enregistrer dans le carnet d'adresses] 3. Sur l'interface principale de WeChat, appuyez sur [Carnet d'adresses]-[Group Chat] pour afficher

Comment vérifier le nombre de groupes que vous avez rejoint sur WeChat : une étape simple Comment vérifier le nombre de groupes que vous avez rejoint sur WeChat : une étape simple Mar 26, 2024 am 10:06 AM

Indépendamment de la vie ou du travail, de nombreuses personnes sont depuis longtemps profondément liées à WeChat et seront à tout moment intégrées à divers groupes. Alors, combien de groupes WeChat avez-vous rejoints ? Vous souhaiterez peut-être immédiatement afficher les discussions de groupe dans votre carnet d'adresses, mais seuls les groupes WeChat que vous avez enregistrés dans votre carnet d'adresses y apparaîtront et les autres groupes ne seront pas visibles. Si vous souhaitez voir tous les groupes WeChat que vous avez rejoints, c'est très simple : entrez votre pseudo dans le champ de recherche de la page d'accueil de WeChat, puis recherchez la section de discussion de groupe dans les résultats de recherche, et cliquez sur « Plus de discussions de groupe » pour afficher toutes les informations liées aux discussions de groupe. Quoi qu'il en soit, j'ai été choqué. Il y en avait plus d'une centaine et la barre de défilement à droite est devenue très petite. Malheureusement, il n'y a pas de statistiques numériques spécifiques... Cette méthode est également applicable pour vérifier les groupes QQ que vous avez rejoints. PS : Certains internautes ont également proposé une astuce :

Comment afficher le centre d'aide Amap_Comment afficher le centre d'aide Amap Comment afficher le centre d'aide Amap_Comment afficher le centre d'aide Amap Apr 01, 2024 pm 05:26 PM

1. Nous ouvrons d'abord la carte Gaode. 2. Cliquez ensuite sur (Mon) dans le coin inférieur droit de la page d'accueil d'Amap, puis cliquez sur Paramètres dans le coin supérieur droit. 3. Enfin, vous pouvez voir le centre d'aide d'Amap.

Huawei P70 démarre directement le plan Pioneer et est officiellement en vente Huawei P70 démarre directement le plan Pioneer et est officiellement en vente Apr 19, 2024 pm 01:58 PM

Zhongguancun News : Le matin du 18 avril, Huawei a soudainement annoncé que la série de téléphones mobiles P70 était officiellement en vente dans le cadre du plan Pioneer. Les amis qui souhaitent acheter devraient être prêts à agir. Selon la pratique passée, les téléphones mobiles phares de Huawei. sont très populaires et seront toujours en rupture de stock. Cette fois, la série Huawei P70 a été renommée Pura, ce qui signifie pur. Yu Chengdong de Huawei a déclaré précédemment : Depuis 2012, les smartphones de la série P de Huawei sont comme des partenaires fidèles, accompagnant des centaines de millions d'utilisateurs à travers le monde pour passer d'innombrables moments précieux et être témoins ensemble de la beauté et de l'excitation de la vie. Il a profondément ressenti que la confiance et l'amour accordés par chaque utilisateur qui choisit la série P de Huawei équivaut à une puissante force motrice, inspirant toujours Huawei à avancer fermement sur la voie de l'innovation. Pura signifie pur.

See all articles