Skip to content
industry insights

L’astuce de PostgreSQL 19 pour réduire les tables a un inconvénient

Un nettoyage de routine pourrait bientôt récupérer de l’espace disque sans provoquer d’interruption de service. Mais un court verrou à l’étape finale peut transformer une requête de longue durée en embouteillage.

Stork editorial team
L’astuce de PostgreSQL 19 pour réduire les tables a un inconvénient

Pourquoi la suppression de lignes ne réduit pas la taille de votre base de données

L’architecture de contrôle de concurrence multiversion (MVCC) de PostgreSQLQL, bien qu’elle soit fondamentale pour les opérations concurrentes sur la base de données, s’accompagne d’un coût inhérent : la fragmentation des tables (table bloat). Lorsqu’une ligne est mise à jour, PostgreSQLQL ne la modifie pas sur place ; il écrit une toute nouvelle copie et marque l’ancienne version comme « morte ». Ce mécanisme garantit que les transactions voient toujours un instantané cohérent des données, mais il laisse derrière lui une traînée de données obsolètes.

Par la suite, les processus VACUUM nettoient ces lignes mortes, rendant leur espace disponible pour de nouvelles données au sein de la même table. Point essentiel : une opération VACUUM de routine ne restitue pas cet espace récupéré au système d’exploitation. Si vous supprimez la moitié de votre table, le fichier sur disque conserve souvent la même taille, une source fréquente de frustration pour les DBA.

Historiquement, la seule méthode intégrée pour réduire physiquement une table et restituer l’espace au système d’exploitation était VACUUM FULL. Cette commande réécrit la table entière en la compactant sur de nouvelles pages disque. Cependant, VACUUM FULL acquiert un verrou ACCESS EXCLUSIVE, qui bloque toutes les lectures et écritures sur la table jusqu’à la fin de l’opération — une conséquence si sévère que la documentation de PostgreSQLQL elle-même en déconseille l’usage dans les environnements de production. Les DBA étaient donc tributaires d’extensions tierces comme pg_repack pour le compactage de tables en ligne.

REPACK déplace le gros du travail hors du chemin critique

PostgreSQLQL 19 offre enfin aux DBA une solution intégrée et en ligne contre la fragmentation des tables : REPACK CONCURRENTLY. Cette commande contourne le VACUUM FULL bloquant en créant une nouvelle version compacte d’une table tout en autorisant les lectures et écritures concurrentes sur l’originale. C’est une avancée majeure pour maintenir les performances sans interruption de service.

Le mécanisme est ingénieux : REPACK commence par copier toutes les lignes actives dans une nouvelle table temporaire. Ensuite, il utilise le décodage logique basé sur les WAL pour capturer les modifications (insertions, mises à jour, suppressions) survenues sur la table d’origine pendant cette phase de copie. Ces modifications capturées sont rejouées sur la nouvelle table, ce qui garantit que son remplacement est entièrement à jour.

Enfin, REPACK pose un bref verrou exclusif pour échanger de manière atomique l’ancien fichier de table avec le nouveau, compact. Cela réduit au minimum la fenêtre critique pendant laquelle la table est indisponible. Le test de Better Stack a montré une table de 493 MB réduite à 228 MB en moins de 10 secondes, tout en restant accessible jusqu’à la bascule finale, momentanée. Il ne s’agit pas d’un benchmark universel, mais cela illustre les économies d’espace disque et l’efficacité opérationnelle que REPACK peut offrir.

Le minuscule verrou qui peut provoquer un énorme embouteillage

REPACK CONCURRENTLY n’a rien de magique ; il se contente de déporter le gros du travail. Si l’essentiel de la copie de la table se déroule en ligne, l’étape finale et cruciale — l’échange de l’ancien fichier de table contre la nouvelle version compactée — exige un verrou exclusif. Ce verrou ACCESS EXCLUSIVE empêche toute opération concurrente sur la table, qu’il s’agisse de lectures ou d’écritures. La fenêtre est minuscule et atomique, mais elle doit attendre la fin de chaque transaction active touchant cette table.

Ce goulot d’étranglement crée un risque opérationnel important. Un test de Better Stack l’a parfaitement démontré : un rapport analytique de 20 secondes, actif pendant la bascule, a retardé l’échange final. Toutes les requêtes suivantes ciblant cette table ont alors été mises en file d’attente pendant 18 secondes complètes, ce qui crée un scénario de head-of-line blocking (blocage en tête de file). L’intérêt du repacking en ligne est amoindri si une seule requête de longue durée peut perturber les opérations concurrentes.

Pour atténuer ce risque, traitez la bascule finale comme un événement critique. Planifiez REPACK CONCURRENTLY pendant les heures creuses, lorsque les rapports de longue durée ou les traitements par lots ont peu de chances d’entrer en concurrence pour l’accès à la table. Vérifiez de manière proactive les sessions actives sur la table cible avant de lancer la commande, ou consultez des ressources comme Documentation PostgreSQLQL : Routine Vacuuming pour en savoir plus sur la gestion de la maintenance des tables. L’objectif est de s’assurer que l’échange des métadonnées se produit sans retard inattendu, afin de transformer une astuce ingénieuse en un outil opérationnel fiable.

Cet article vous plaît ? Recevez-en un comme celui-ci chaque matin.

un e-mail par jour · désinscription en deux clics · aucun traqueur tiers

Un outil natif, mais pas une raison de se passer de planification

REPACK CONCURRENTLY, l’outil natif de PostgreSQLQL 19, constitue une alternative intéressante aux outils tiers comme pg_repack, un incontournable de la communauté depuis plus de dix ans. La prise en charge intégrée simplifie la gestion des extensions, évite les problèmes de compatibilité et peut améliorer l’intégration avec les opérations centrales de la base de données. Cette évolution reflète une tendance croissante à internaliser des fonctionnalités essentielles pour les DBA.

Cependant, « natif » ne signifie pas « magique ». Si la vidéo de Better Stack cite une date de sortie cible fixée au 19 novembre pour PostgreSQLQL 19, les utilisateurs doivent vérifier l’état actuel de la publication et la prise en charge par leur fournisseur avant de planifier toute migration. Les services managés, en particulier, peuvent retarder l’adoption de nouvelles fonctionnalités ou imposer des restrictions sur les nouvelles commandes ; confirmez donc toujours les capacités auprès de votre fournisseur.

Le parcours de développement de PostgreSQLQL 19 a été, comme le note la vidéo, « chaotique », avec des fonctionnalités annoncées, annulées et réduites au profit de la stabilité. Cette approche prudente est caractéristique du PostgreSQLQL Global Development Group. Par conséquent, avant de s’appuyer sur REPACK CONCURRENTLY pour des charges de travail de production, confirmez son comportement précis et les éventuelles réserves opérationnelles dans la documentation officielle de PostgreSQLQL 19.

En définitive, REPACK CONCURRENTLY est une nouvelle flèche puissante dans le carquois du DBA, et non une solution miracle. Son verrou exclusif, bref mais critique, implique qu’une planification stratégique reste indispensable. L’exécuter pendant des périodes de faible activité ou en l’absence de requêtes de longue durée maximisera son intérêt et évitera la mise en file d’attente de 18 secondes observée lors des tests de Better Stack.

Foire aux questions

Que fait REPACK dans PostgreSQL 19 ?

REPACK reconstruit une table selon une disposition physique plus compacte, ce qui récupère l’espace disque inutilisé tout en permettant à l’activité normale de la base de données de se poursuivre.

En quoi REPACK diffère-t-il de VACUUM FULL ?

VACUUM FULL réécrit une table en maintenant un verrou bloquant pendant toute l’opération. REPACK CONCURRENTLY effectue l’essentiel de son travail alors que la table reste accessible, puis nécessite un bref verrou exclusif pour basculer les fichiers.

REPACK CONCURRENTLY peut-il encore affecter le trafic applicatif ?

Oui. L’échange final doit attendre la fin des requêtes utilisant la table, et les nouvelles requêtes peuvent être mises en file d’attente derrière le verrou.

PostgreSQL 19 rend-il pg_repack obsolète ?

Cette fonctionnalité peut réduire le besoin de pg_repack dans certains cas, mais les équipes doivent comparer la disponibilité et l’adéquation opérationnelle de la fonctionnalité intégrée avec leurs outils existants.

Found this useful? Share it.

For builders

Want Stork to write one of these about your product?

Send us a URL. We use the product, form a view, and publish what we actually think — in 8 languages, labeled Sponsored, with no copy approval on your side. That last part is what makes it worth quoting.

See how it works$199 · AI tools & software only

Pour les builders

Cette page travaille pour l’outil de quelqu’un d’autre.

Les agents IA la lisent. Des acheteurs y arrivent. Elle répond en huit langues et via MCP. Votre outil peut avoir la sienne — en ligne en 24 heures.