PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 17.1 » Internes » Stockage physique de la base de données » Heap-Only Tuples (HOT)

65.7. Heap-Only Tuples (HOT) #

Pour permettre une haute concurrence, PostgreSQL utilise un système connu sous l'acronyme MVCC pour enregistrer les lignes. Néanmoins, MVCC a quelques inconvénients pour les requêtes de mise à jour. Notamment, les mises à jour nécessitent que des nouvelles versions de lignes soient ajoutées aux tables. Ceci peut aussi nécessiter l'ajout de nouveaux enregistrements dans les index pour chaque ligne mise à jour, et la suppression des anciennes versions de lignes et de leurs enregistrements dans les index peut être coûteuse.

Pour aider à réduire la surcharge des mises à jour, PostgreSQL dispose d'une optimisation appelée heap-only tuples (HOT). Cette optimisation est possible quand :

  • La mise à jour ne modifie aucune colonne références par les index de la table, sans inclure les index par résumé. La seule méthode d'indexation par résumé disponible dans PostgreSQL est BRIN.

  • Il y a suffisamment d'espace libre dans le bloc contenant l'ancienne ligne pour y enregistrer la nouvelle ligne.

Dans de tels cas, heap-only tuples fournit deux optimisations :

  • Les nouveaux enregistrements dans les index ne sont pas nécessaires pour représenter les lignes mises à jour. Cependant, les index par résumé pourraient avoir besoin d'être mis à jour.

  • Quand une ligne est mise à jour plusieurs fois, les versions de ligne autres que la plus ancienne et la plus récente peuvent être complètement supprimées lors d'opérations standards comme SELECT, plutôt que d'attendre une opération de nettoyage périodique. (Les index font toujours référence à l'identifiant de l'élément du bloc correspondant à la version originale de la ligne. Les données de la ligne associées avec cette version de ligne sont supprimées et son identifiant de ligne est converti en redirection pointant vers la version la plus ancienne toujours visible à au moins une transaction. Les versions de ligne intermédiaites qui ne sont plus visibles par qui que ce soit sont complètement supprimées, et les identifiants d'élément de bloc associés sont disponibles pour une réutilisation.)

Vous pouvez augmenter la possibilité d'avoir suffisamment d'espace dans les blocs pour les mises à jour HOT en diminuant la valeur du paramètre fillfactor d'une table. Si vous ne le faites pas, les mises à jour HOT se feront tout de même parce que les nouvelles lignes iront naturellement vers de nouveaux blocs et des blocs existants avec suffisamment d'espace ligne pour les nouvelles versions de lignes. La vue système pg_stat_all_tables permet de superviser l'occurence des mises à jour HOT et non HOT.