Nous comprenons encore mieux les plans des requĂȘtes PostgreSQL

Il y a six mois nous avons prĂ©sentĂ© explain.tensor.ru — un service public pour l'analyse et la visualisation des plans de requĂȘtes pour PostgreSQL.

Nous comprenons encore mieux les plans des requĂȘtes PostgreSQL

Au cours des mois Ă©coulĂ©s, nous avons fait une prĂ©sentation Ă  PGConf.Russia 2020 , prĂ©parĂ© un article rĂ©capitulatifsur l'accĂ©lĂ©ration des requĂȘtes SQL basĂ© sur les recommandations qu'il fournit
 mais surtout, nous avons recueilli vos retours et observĂ© des cas d'utilisation rĂ©els. Et maintenant, nous sommes prĂȘts Ă  vous parler des nouvelles fonctionnalitĂ©s que vous pouvez utiliser.

Support de différents formats de plans

Le plan du journal, avec la requĂȘte

Nous sélectionnons directement dans la console tout le bloc, à partir de la ligne avec

Query Text , en incluant tous les espaces devant :Query Text: INSERT INTO dicquery_20200604 VALUES ($1.*) ON CONFLICT (query) DO NOTHING; Insertion dans dicquery_20200604 (coût=0.00..0.05 lignes=1 largeur=52) (temps réel=40.376..40.376 lignes=0 boucles=1) Résolution des conflits : RIEN Index de conflit : dicquery_20200604_pkey Tuples insérés : 1 Tuples en conflit : 0 Tampons : partagé hit=9 lu=1 sali=1 -> Résultat (coût=0.00..0.05 lignes=1 largeur=52) (temps réel=0.001..0.001 lignes=1 boucles=1)

        
 et nous collons tout ce qui a été copié directement dans le champ pour le plan, sans rien séparer :

En sortie, nous obtenons en bonus au plan analysé également un

Nous comprenons encore mieux les plans des requĂȘtes PostgreSQL

onglet « contexte » , oĂč notre requĂȘte est prĂ©sentĂ©e dans toute sa splendeur :JSON et YAML

Nous comprenons encore mieux les plans des requĂȘtes PostgreSQL

EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) SELECT * FROM pg_class;

"[
  {
    "Plan": {
      "Node Type": "Seq Scan",
      "Parallel Aware": false,
      "Relation Name": "pg_class",
      "Alias": "pg_class",
      "Startup Cost": 0.00,
      "Total Cost": 1336.20,
      "Plan Rows": 13804,
      "Plan Width": 539,
      "Actual Startup Time": 0.006,
      "Actual Total Time": 1.838,
      "Actual Rows": 10266,
      "Actual Loops": 1,
      "Shared Hit Blocks": 646,
      "Shared Read Blocks": 0,
      "Shared Dirtied Blocks": 0,
      "Shared Written Blocks": 0,
      "Local Hit Blocks": 0,
      "Local Read Blocks": 0,
      "Local Dirtied Blocks": 0,
      "Local Written Blocks": 0,
      "Temp Read Blocks": 0,
      "Temp Written Blocks": 0
    },
    "Planning Time": 5.135,
    "Triggers": [
    ],
    "Execution Time": 2.389
  }
]"

Que ce soit avec des guillemets externes, comme les copie pgAdmin, ou sans — nous mettons dans le mĂȘme champ, au final — c'est magnifique :

Visualisation avancée

Nous comprenons encore mieux les plans des requĂȘtes PostgreSQL

Temps de planification / Temps d'exécution

Maintenant, il est plus clair oĂč est passĂ© le temps supplĂ©mentaire lors de l'exĂ©cution de la requĂȘte :

Temps d'E/S

Nous comprenons encore mieux les plans des requĂȘtes PostgreSQL

Parfois, on doit faire face Ă  la situation oĂč, dans le plan, il semble qu'il n'y avait pas trop de ressources lues/Ă©crites, mais le temps d'exĂ©cution est anormalement long.

Ici, il faut dire : "

Oh, peut-ĂȘtre que ce moment-lĂ , le disque sur le serveur Ă©tait trop chargĂ©, donc il y a eu beaucoup de temps de lecture !" Mais ce n'est pas trĂšs prĂ©cis
" Mais ce n'est pas vraiment prĂ©cis..."

Mais cela peut ĂȘtre dĂ©terminĂ© de maniĂšre absolument fiable. En effet, parmi les options de configuration du serveur PG, il y a track_io_timing:

Il permet de mesurer le temps des opĂ©rations d'entrĂ©e/sortie. Ce paramĂštre est dĂ©sactivĂ© par dĂ©faut, car il nĂ©cessite de demander en continu l'heure actuelle au systĂšme d'exploitation, ce qui peut considĂ©rablement ralentir le fonctionnement sur certaines plates-formes. Pour Ă©valuer le coĂ»t de la mesure du temps sur votre plate-forme, vous pouvez utiliser l'outil pg_test_timing. Les statistiques d'entrĂ©e/sortie peuvent ĂȘtre obtenues via la vue pg_stat_database, dans la sortie d'EXPLAIN (lorsque le paramĂštre BUFFERS est utilisĂ©) et via la vue pg_stat_statements.

Ce paramĂštre peut Ă©galement ĂȘtre activĂ© dans le cadre d'une session locale :

SET track_io_timing = TRUE;

Eh bien, maintenant vient le meilleur — nous avons appris Ă  comprendre et Ă  reprĂ©senter ces donnĂ©es en tenant compte de toutes les transformations de l'arbre d'exĂ©cution :

Nous comprenons encore mieux les plans des requĂȘtes PostgreSQL

On peut ainsi remarquer que sur 0.790 ms de temps d'exécution, 0.718 ms ont été consacrées à la lecture d'une seule page de données, 0.044 ms à son écriture, et il n'a fallu que 0.028 ms pour toute autre activité utile !

L'avenir avec PostgreSQL 13

Vous pouvez consulter l'intégralité des nouveautés dans un article détaillé, et nous allons nous concentrer spécifiquement sur les changements dans les plans.

Planning buffers

La prise en compte des ressources allouées au planificateur trouve également son reflet dans un autre patch, ne se rapportant pas à pg_stat_statements. EXPLAIN avec l'option BUFFERS indiquera le nombre de buffers utilisés lors de l'étape de planification :

 Seq Scan on pg_class (actual rows=386 loops=1)
   Buffers: shared hit=9 read=4
 Planning Time: 0.782 ms
   Buffers: shared hit=103 read=11
 Execution Time: 0.219 ms

Nous comprenons encore mieux les plans des requĂȘtes PostgreSQL

Tri incrémentiel

Dans les cas oĂč un tri est nĂ©cessaire sur plusieurs clĂ©s (k1, k2, k3
), le planificateur peut dĂ©sormais tirer parti du fait que les donnĂ©es sont dĂ©jĂ  triĂ©es selon certaines des premiĂšres clĂ©s (par exemple, k1 et k2). Dans ce cas, il n'est pas nĂ©cessaire de trier toutes les donnĂ©es Ă  nouveau, mais de les diviser en groupes sĂ©quentiels avec des valeurs k1 et k2 identiques, et de "trier" en fonction de la clĂ© k3.

Ainsi, l'ensemble du tri se divise en plusieurs tris séquentiels de plus petite taille. Cela réduit la mémoire nécessaire et permet également de fournir les premiÚres données plus tÎt, avant l'achÚvement complet de tout le tri.

 Tri incrémental (lignes actuelles=2949857 boucles=1)
   Clé de tri : ticket_no, passenger_id
   Clé pré-triée : ticket_no
   Groupes de tri complet : 92184 Méthode de tri : quicksort Mémoire : avg=31kB peak=31kB
   -> Scan d'index utilisant tickets_pkey sur tickets (lignes actuelles=2949857 boucles=1)
 Temps de planification : 2.137 ms
 Temps d'exécution : 2230.019 ms

Nous comprenons encore mieux les plans des requĂȘtes PostgreSQL
Nous comprenons encore mieux les plans des requĂȘtes PostgreSQL

Améliorations UI/UX

Captures d'écran, elles sont partout !

Maintenant, chaque onglet a la possibilitĂ© de rapidement prendre une capture d'Ă©cran de l'onglet dans le presse-papiers sur toute la largeur et la profondeur de l'onglet — « viseur » en haut Ă  droite:

Nous comprenons encore mieux les plans des requĂȘtes PostgreSQL

En fait, la plupart des images pour cette publication ont été obtenues de cette maniÚre.

Recommandations sur les nƓuds

Non seulement elles sont devenues plus nombreuses, mais on peut aussi les lire en détail dans l'article, en suivant le lien :

Nous comprenons encore mieux les plans des requĂȘtes PostgreSQL

Suppression de l'archive

Certains ont vraiment demandĂ© d'ajouter la possibilitĂ© de supprimer « complĂštement » mĂȘme les plans non publiĂ©s dans l'archive — s'il vous plaĂźt, il suffit de cliquer sur l'icĂŽne correspondante :

Nous comprenons encore mieux les plans des requĂȘtes PostgreSQL

Eh bien, n'oublions pas que nous avons un groupe de soutien, oĂč vous pouvez Ă©crire vos commentaires et suggestions.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster