Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Récupération de l’espace de table via une opération de vacuum
PostgreSQL Multiversion Concurrency Control (MVCC) permet de préserver l’intégrité des données en enregistrant une copie interne des lignes mises à jour ou supprimées jusqu’à ce qu’une transaction soit validée ou annulée. Ces copies, également appelées tuples, peuvent provoquer un gonflement de la table si elles ne sont pas nettoyées régulièrement. Les instances PostgreSQL ordonnent les transactions selon leurs ID de transaction, et PostgreSQL utilise un modèle MVCC basé sur les ID de transaction pour déterminer la visibilité des tuples et assurer l’isolation des transactions. Chaque transaction établit un instantané des données, et chaque tuple possède une version. L’instantané et la version sont tous deux basés sur l’ID de transaction.
Pour nettoyer les données, l’utilitaire VACUUMexécute quatre fonctions clés dans PostgreSQL :
-
VACUUM: supprime les versions de ligne expirées, rendant ainsi l’espace disponible pour une réutilisation. -
VACUUM FULL: permet une défragmentation complète en supprimant les lignes inactives et en compactant les tables, en réduisant la taille et en augmentant l’efficacité. -
VACUUM FREEZE: protège contre les problèmes de bouclage des ID de transaction en marquant les anciennes versions de lignes comme étant bloquées. -
VACUUM ANALYZE: supprime les versions des lignes inactives et met à jour les statistiques de planification des requêtes de la base de données. Il s’agit d’une combinaison des fonctionsVACUUMetANALYZE. Pour plus d’informations sur le fonctionnement deANALYZEdans Aurora PostgreSQL Limitless Database, consultez ANALYSE.
Comme dans MVCC, l’opération de vacuum dans Aurora PostgreSQL est basée sur l’ID de transaction. Si une transaction est en cours lorsque le l’opération de vacuum commence, les lignes qui sont toujours visibles pour cette transaction ne sont pas supprimées.
Pour plus d’informations sur l’utilitaire VACUUM, consultez VACUUMVACUUM dans Aurora PostgreSQL Limitless Database, consultez VACUUM.
Rubriques
AUTOVACUUM
Aurora PostgreSQL utilise les utilitaires VACUUM et AUTOVACUUM pour supprimer les tuples inutiles. Le mécanisme sous-jacent de l’AUTOVACUUM et du VACUUM manuel sont les mêmes ; la seule différence réside dans l’automatisation.
AUTOVACUUM dans Aurora PostgreSQL et Aurora PostgreSQL Limitless Database est une combinaison des utilitaires VACUUM et ANALYZE. AUTOVACUUM détermine les bases de données et les tables à nettoyer, selon une règle prédéfinie, telle que le pourcentage de tuples inactifs et le nombre d’insertions.
Par exemple, AUTOVACUUM « se réveille » périodiquement pour effectuer un nettoyage. L’intervalle est contrôlé par le paramètre autovacuum_naptime. La valeur par défaut est de 1 minute. Les valeurs par défaut des paramètres de configuration AUTOVACUUM et VACUUM sont les mêmes dans Aurora PostgreSQL Limitless Database et Aurora PostgreSQL.
Le démon AUTOVACUUM, s’il est activé, émet automatiquement des commandes ANALYZE chaque fois que le contenu d’une table a suffisamment changé. Dans Aurora PostgreSQL Limitless Database, AUTOVACUUM émet une command ANALYZE sur les routeurs et les partitions.
Pour plus d’informations sur le démon AUTOVACUUM et les paramètres de stockage des tables associés à AUTOVACUUM, consultez Le démon autovacuum
Vacuum basé sur le temps dans Aurora PostgreSQL Limitless Database
Aurora PostgreSQL Limitless Database est un système distribué, ce qui signifie que plusieurs instances peuvent être impliquées dans une transaction. Par conséquent, la visibilité basée sur l’ID de transaction ne s’applique pas. Aurora PostgreSQL Limitless Database utilise à la place un mécanisme de visibilité basé sur le temps, car les ID de transaction ne sont pas unifiés entre les instances, tandis que le temps, lui, peut l’être. Chaque instantané de transaction et chaque version de tuple se réfèrent au temps plutôt qu’à l’ID de transaction. Plus précisément, chaque instantané de transaction est associé à une heure de début, et chaque tuple enregistre une heure de création (au moment d’une INSERT ou d’une UPDATE) ainsi qu’une heure de suppression (au moment d’une DELETE).
Pour maintenir la cohérence des données entre les instances du groupe de partitions de base de données, Aurora PostgreSQL Limitless Database doit s’assurer que l’opération de vacuum ne supprime aucun tuple encore visible pour les transactions actives du groupe de partitions de base de données. Par conséquent, les opérations de vacuum sont également basées sur le temps dans Aurora PostgreSQL Limitless Database. D’autres aspects de VACUUM demeurent inchangés, notamment le fait que, pour exécuter VACUUM sur une table donnée, l’utilisateur doit disposer d’un accès à cette table.
Note
Il est vivement déconseillé de laisser les transactions ouvertes pendant de longues périodes.
Les opérations de vacuum basées sur le temps consomme plus de mémoire que celles qui sont basées sur l’ID de transaction.
L’exemple suivant illustre le fonctionnement des opérations de vacuum basées sur le temps.
-
Une table client est répartie sur quatre partitions.
-
La transaction 1 commence par une lecture répétable et ne cible qu’une seule partition (partition 1). Cette transaction reste ouverte.
La transaction 1 est plus ancienne que toute autre transaction lancée après elle.
-
La transaction 2 démarre plus tard et supprime tous les tuples d’une table, puis valide la transaction.
-
Si l’
AUTOVACUUMou leVACUUMmanuel tente de nettoyer les tuples inactifs (résultant de la transaction 2), rien n’est supprimé.Cela est vrai non seulement pour la partition 1, mais également pour les partitions 2 à 4, car la transaction 1 peut toujours avoir besoin d’accéder à ces tuples. Ils sont toujours visibles pour la transaction 1 grâce au MVCC.
La dernière étape est réalisée par le biais d’une synchronisation, afin que toutes les partitions soient informées de la transaction 1, même si celle-ci ne les concerne pas toutes.
Utilisation des statistiques de base de données pour l’opération de vacuum
Pour obtenir des informations sur les tuples susceptibles de nécessiter un nettoyage, utilisez la vue limitless_stat_all_tables, qui fonctionne de la même manière que pg_stat_all_tables
SELECT * FROM rds_aurora.limitless_stat_all_tables WHERE relname LIKE '%customer%';
De même, pour les statistiques de base de données, utilisez limitless_stat_database au lieu de pg_stat_database
Pour vérifier l’utilisation du disque de la table, utilisez la fonction limitless_stat_relation_sizes, qui fonctionne de la même manière que pg_relation_size
SELECT * FROM rds_aurora.limitless_stat_relation_sizes('public','customer');
Pour suivre la progression d’une opération VACUUM sur Aurora PostgreSQL Limitless Database, utilisez la vue limitless_stat_progress_vacuum au lieu de pg_stat_progress_vacuum
SELECT * FROM rds_aurora.limitless_stat_progress_vacuum;
Pour plus d’informations, consultez Vues d’Aurora PostgreSQL Limitless Database et Fonctions d’Aurora PostgreSQL Limitless Database.
Différences dans le comportement des opérations de vacuum entre Aurora PostgreSQL et Aurora PostgreSQL Limitless Database
Les différences suivantes distinguent également Aurora PostgreSQL et Aurora PostgreSQL Limitless Database en ce qui concerne le processus de vacuum :
-
Aurora PostgreSQL exécute des opérations
VACUUMsur les ID de transaction jusqu’à la plus ancienne transaction en cours. S’il n’y a aucune transaction en cours dans la base de données,VACUUMexécute l’opération jusqu’à la dernière transaction. -
Aurora PostgreSQL Limitless Database synchronise le plus ancien instantané toutes les 10 secondes. Par conséquent,
VACUUMpeut ne pas exécuter l’opération sur les transactions ayant été effectuées au cours des 10 dernières secondes.
Pour plus d’informations sur la prise en charge de VACUUM dans Aurora PostgreSQL Limitless Database, consultez VACUUM dans le Référence Aurora PostgreSQL Limitless Database.