<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
  <title>Data Bene - Tag: 'Statistiques'</title>
  <subtitle>Base de données relationnelles, open-source et adaptives.</subtitle>
  <link href="https://www.data-bene.io/fr/blog/tag/statistiques/feed.xml" rel="self" type="application/atom+xml" />
  <updated>2025-09-29T00:00:00Z</updated>
  <id>https://www.data-bene.io/fr/blog/tag/statistiques/feed.xml</id>
    <entry>
      <title>Statistiques cumulatives dans PostgreSQL 18</title>
      <link href="https://www.data-bene.io/fr/blog/statistiques-cumulatives-dans-postgresql-18/" />
      <updated>2025-09-29T00:00:00Z</updated>
      <id>https://www.data-bene.io/fr/blog/statistiques-cumulatives-dans-postgresql-18/</id>
     <content type="html"><![CDATA[ <p>Dans <strong>PostgreSQL 18</strong>, le sous-système de statistiques et de supervision bénéficie d’une refonte majeure: statistiques cumulatives étendues, nouvelle visibilité I/O par backend, possibilité pour les extensions d’exporter / importer / ajuster les statistiques, et améliorations des contrôles GUC ainsi que du comportement de cache et de snapshot. Ces changements ouvrent de nouvelles perspectives pour l’analyse de performance, la simulation inter-environnements et une meilleure intégration avec les extensions. Dans cet article, j’explore les nouveautés, les points d’attention, les paramètres GUC, ainsi que la manière dont les auteurs d’extensions peuvent exploiter la nouvelle API en C.</p>
<h2 id="introduction-and-motivation"><a class="heading-anchor" href="#introduction-and-motivation">Introduction &amp; motivation</a></h2>
<p>Les statistiques (au sens large: compteurs de supervision, métriques I/O, et estimations pour le planificateur / optimiseur) sont au cœur à la fois de l’optimisation de performance et des décisions internes de PostgreSQL. Des statistiques transparentes, fiables et manipulables permettent entre autres aux DBAs d’adresser directement l’efficacité de PostgreSQL, et donnent aux «extensions» la possibilité d’améliorer l’expérience utilisateur.</p>
<p>Cela dit, le système historique de statistiques de PostgreSQL n’était pas exempt de frictions: capacité limitée à réinitialiser les statistiques des relations, métriques exprimées dans des unités pas toujours alignées avec les besoins utilisateurs, absence d’API C pour utiliser le moteur de statistiques cumulatives de PostgreSQL. PostgreSQL 18 répond directement à ces préoccupations.</p>
<p>Voici un résumé des améliorations clés.</p>
<h2 id="un-avertissement-sur-les-statistiques"><a class="heading-anchor" href="#un-avertissement-sur-les-statistiques">Un avertissement sur les statistiques</a></h2>
<p>Bien que les statistiques soient extrêmement utiles, leur collecte peut consommer du temps et des ressources. PostgreSQL 18 introduit un point important: avec l’élargissement du spectre des métriques collectables, la taille maximale de la table de hachage a été augmentée. Gardez cela à l’esprit, surtout si vous concevez des systèmes à grande échelle avec des architectures «un ensemble de tables par client»: on a constaté que la limite de 1 Go pouvait être atteinte avec quelques millions de tables.</p>
<h2 id="quoi-de-neuf-dans-postgresql-18-et-les-«-stats-»"><a class="heading-anchor" href="#quoi-de-neuf-dans-postgresql-18-et-les-«-stats-»">Quoi de neuf dans PostgreSQL 18 et les « stats »</a></h2>
<p>Voici les nouvelles fonctionnalités majeures ou les améliorations concernant les statistiques et la supervision.</p>
<p>De manière générale, <a href="https://www.postgresql.org/docs/18/monitoring-stats.html#MONITORING-PG-STAT-IO-VIEW" rel="noopener">pg_stat_io</a> rapporte désormais l’activité I/O en octets plutôt qu’en pages, ce qui est plus pratique pour l’analyse. De plus, les statistiques WAL y ont été déplacées depuis <code>pg_stat_wal</code>, offrant ainsi une vue unique et complète.</p>
<h3 id="mises-a-jour"><a class="heading-anchor" href="#mises-a-jour">Mises à jour</a></h3>
<p><a href="https://www.postgresql.org/docs/18/pgupgrade.html" rel="noopener">pg_upgrade</a> est désormais capable de conserver les statistiques de l’optimiseur, supprimant la nécessité de relancer un <code>ANALYZE</code> complet pour obtenir de bons plans de requêtes après une montée de version: une avancée très attendue pour les grandes bases!</p>
<p>Attention toutefois: les statistiques personnalisées ajoutées par une extension ainsi que celles créées avec <a href="https://www.postgresql.org/docs/18/sql-createstatistics.html" rel="noopener">CREATE STATISTICS</a> ne sont pas conservées.</p>
<p>Vous voudrez sûrement examiner les nouvelles options de <a href="https://www.postgresql.org/docs/18/app-vacuumdb.html" rel="noopener">vacuumdb</a> (<code>--missing-stats-only</code>) pour n’analyser que ce qui est nécessaire.</p>
<p>Dans la même veine, l’option <code>--[no-]statistics</code> a été ajoutée à <a href="https://www.postgresql.org/docs/18/app-pgdump.html" rel="noopener">pg_dump</a>, <a href="https://www.postgresql.org/docs/18/app-pgdumpall.html" rel="noopener">pg_dumpall</a>, et <a href="https://www.postgresql.org/docs/18/app-pgrestore.html" rel="noopener">pg_restore</a>.</p>
<h3 id="maintenance"><a class="heading-anchor" href="#maintenance">Maintenance</a></h3>
<p>Il est désormais plus simple d’évaluer l’effort de maintenance sur les objets, puisque le temps total passé dans les opérations VACUUM et ANALYZE (y compris<br>
automatiques) est rapporté dans <a href="https://www.postgresql.org/docs/18/monitoring-stats.html#MONITORING-PG-STAT-ALL-TABLES-VIEW" rel="noopener">pg_stat_all_tables</a> et ses variantes.</p>
<p>Un nouveau GUC à ne pas oublier: <a href="https://www.postgresql.org/docs/18/runtime-config-statistics.html#GUC-TRACK-COST-DELAY-TIMING" rel="noopener">track_cost_delay_timing</a>. Il collecte le temps passé à dormir (suite aux opérations retardées) pour <code>VACUUM</code> et <code>ANALYZE</code>. Très intéressant, mais comme les autres GUC <code>track_io*</code>, il multiplie les appels à l’horloge système, ce qui peut provoquer un impact sévère sur certaines plateformes. Toujours vérifier avec un outil comme <a href="https://www.postgresql.org/docs/18/pgtesttiming.html" rel="noopener">pg_test_timing</a> pour s’assurer que votre système peut le supporter!</p>
<p>Plus de questions sur l’activité du checkpointer grâce à <a href="https://www.postgresql.org/docs/18/monitoring-stats.html#MONITORING-PG-STAT-CHECKPOINTER-VIEW" rel="noopener">pg_stat_checkpointer</a>. Le nouvel attribut <code>num_done</code> indique le nombre de checkpoints <strong>terminés</strong>. Vous pouvez aussi savoir quel type de buffers a été écrit grâce à <code>slru_written</code>, et <code>buffers_written</code> qui ne concerne désormais que <code>shared_buffers</code>: auparavant, journal et vue n’affichaient pas les mêmes totaux, car un compteur <code>SLRU</code> <a href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=17cc5f666" rel="noopener">existait dans un cas mais pas dans l’autre</a>.</p>
<h3 id="analyse"><a class="heading-anchor" href="#analyse">Analyse</a></h3>
<p>Envie d’en savoir plus sur l’I/O traité par un backend (PID) ? Appelez <a href="https://www.postgresql.org/docs/18/monitoring-stats.html#PG-STAT-GET-BACKEND-IO" rel="noopener">pg_stat_get_backend_io(int)</a> et vous obtiendrez une sortie similaire à la vue <code>pg_stat_io</code>, mais pour ce processus. Pour les stats WAL de ce PID: utilisez <a href="https://www.postgresql.org/docs/18/monitoring-stats.html#PG-STAT-GET-BACKEND-WAL" rel="noopener">pg_stat_get_backend_wal(int)</a>.</p>
<p>De nouveaux attributs <code>parallel_workers_to_launch</code> et <code>parallel_workers_launched</code> apparaissent dans <a href="https://www.postgresql.org/docs/18/monitoring-stats.html#MONITORING-PG-STAT-DATABASE-VIEW" rel="noopener">pg_stat_database</a>. Le ratio permet de savoir si nous avons assez de slots pour les workers parallèles.</p>
<p>Changements intéressants dans <a href="https://www.postgresql.org/docs/18/pgstatstatements.html" rel="noopener">pg_stat_statements</a>: plus de requêtes seront regroupées sous le même identifiant. Par exemple, les<br>
motifs <code>IN (1,2,3, ...)</code> n’utiliseront que la première et la dernière constante. Un changement plus contre-intuitif concerne le nom de table utilisé dans une requête: seul le nom est pris en compte, pas le schéma ni l’OID de relation. Cela permet de suivre les tables supprimées ou recréées, mais cela peut aussi regrouper les stats de tables sans lien ayant simplement le même nom. Pour séparer les stats de tables homonymes, il faudra les aliaser dans les requêtes (<code>FROM my.table mt, other.table ot</code>)…</p>
<p>Enfin, ajouts à <a href="https://www.postgresql.org/docs/18/view-pg-backend-memory-contexts.html" rel="noopener">pg_backend_memory_contexts</a> avec <code>path</code> (pour récupérer parent/enfant) et <code>type</code> pour distinguer les contextes <code>AllocSet</code>, <code>Generation</code>, <code>Slab</code> et <code>Bump</code>… Et au fait, que sont <code>Slab</code> et <code>Bump</code> ? Pas documentés ; il faut <a href="https://github.com/postgres/postgres/tree/master/src/backend/utils/mmgr" rel="noopener">lire les en-têtes des fichiers C ici</a>. Ils existent pour optimiser l’allocation, la réallocation et la réinitialisation mémoire selon les usages attendus. Par exemple, <code>Slab</code> est défini comme un «MemoryContext implementation designed for cases where large numbers of equally-sized objects can be allocated and freed efficiently with minimal memory wastage and fragmentation».</p>
<p>Ah, non, encore une dernière: <code>wal_buffers_full</code> a été ajouté à <code>pg_stat_statements</code> pour permettre un meilleur réglage de <code>wal_buffers</code>.</p>
<h3 id="replication"><a class="heading-anchor" href="#replication">Réplication</a></h3>
<p>De meilleures informations apparaissent désormais pour la gestion des conflits en réplication logique grâce à de nouveaux attributs dans <a href="https://www.postgresql.org/docs/18/monitoring-stats.html#MONITORING-PG-STAT-SUBSCRIPTION-STATS" rel="noopener">pg_stat_subscription_stats</a>. En référence, cet extrait du <a href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=6c2b5edec" rel="noopener">commit</a> liste les attributs introduits:</p>
<ul class="list">
<li><code>confl_insert_exists</code>: nombre de fois où une insertion de ligne a violé une contrainte unique NOT DEFERRABLE.</li>
<li><code>confl_update_origin_differs</code>: nombre de fois où une mise à jour a été faite sur une ligne déjà modifiée par une autre origine.</li>
<li><code>confl_update_exists</code>: nombre de fois où la valeur mise à jour d’une ligne viole une contrainte unique NOT DEFERRABLE.</li>
<li><code>confl_update_missing</code>: nombre de fois où le tuple à mettre à jour est manquant.</li>
<li><code>confl_delete_origin_differs</code>: nombre de fois où une suppression a été effectuée sur une ligne déjà modifiée par une autre origine.</li>
<li><code>confl_delete_missing</code>: nombre de fois où le tuple à supprimer est manquant.</li>
</ul>
<h3 id="avance"><a class="heading-anchor" href="#avance">Avancé</a></h3>
<p>Un <a href="https://www.postgresql.org/docs/18/functions-admin.html#FUNCTIONS-ADMIN-STATSMOD" rel="noopener">nouveau jeu de fonctions</a> permet désormais de gérer les statistiques de relations et d’attributs (<code>relpages</code>, <code>avg_width</code>, etc.). Cela offre la possibilité d’exporter, importer et ajuster les stats à volonté, afin de répliquer le comportement du planificateur hors production, de maintenir des stats corrigées, et plus encore.</p>
<h3 id="mon-prefere-pour-les-auteurs-dextensions-la-nouvelle-api-c-de-stats"><a class="heading-anchor" href="#mon-prefere-pour-les-auteurs-dextensions-la-nouvelle-api-c-de-stats">Mon préféré pour les auteurs d’extensions: la nouvelle API C de stats</a></h3>
<p>L’une des évolutions les plus enthousiasmantes est ce que PostgreSQL 18 <em>ouvre</em> aux auteurs d’extensions.</p>
<p>Cette petite ligne au bas de la section <a href="https://www.postgresql.org/docs/18/release-18.html#RELEASE-18-MODULES" rel="noopener">E.1.3.9 Modules</a> est celle qui nous intéresse :</p>
<blockquote>
<p>Allow extensions to use the server’s cumulative statistics API (Michael Paquier)</p>
</blockquote>
<p>Jusqu’ici, la manipulation des statistiques était réservée à l’interne ; désormais, une API officielle et structurée est disponible pour construire (ou envelopper) autour.</p>
<p>Le <a href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7949d9594" rel="noopener">message de commit</a> est bien rédigé et couvre l’essentiel des nouveautés. Un sous-ensemble des options est <a href="https://www.postgresql.org/docs/18/xfunc-c.html#XFUNC-ADDIN-CUSTOM-CUMULATIVE-STATISTICS" rel="noopener">détaillé dans la documentation</a>. Cependant, il faut encore plonger dans le code source pour en savoir plus ; en particulier, il vaut la peine de regarder l’extension <code>injection points</code> (fournie avec PostgreSQL) qui utilise cette nouvelle API.</p>
<p>Pour aller plus loin sur la manière dont une extension peut exploiter ces nouvelles capacités, vous pourrez bientôt découvrir <strong>PACS (PostgreSQL Advanced Cumulative Statistics)</strong> sur Codeberg : mon projet qui propose une bibliothèque de wrappers et des utilitaires autour des nouvelles APIs de statistiques de PostgreSQL 18.</p>
<p>En attendant, la présentation que j’ai donnée à <a href="https://archive.fosdem.org/2025/schedule/event/fosdem-2025-4496-stats-roll-baby-stats-roll-/" rel="noopener">FOSDEM 2025</a> explore ce sujet plus en détail.</p>
 ]]></content>
			<author>
				<name>Cédric Villemain</name>
			</author>
    </entry>
</feed>
