Documentation PostgreSQL 14.22 » Internes » Stockage physique de la base de données » Heap-Only Tuples (HOT)

Précédent | Niveau supérieur | Suivant
70.6. Emplacement des pages de la base de données | Sommaire | Chapitre 71. Déclaration du catalogue système et contenu initial

## 70.7. Heap-Only Tuples (HOT)

Pour permettre une concurrence plus importante, PostgreSQL utilise le système de contrôle de la concurrence multiversion (MVCC) pour enregistrer les lignes. Néanmoins, MVCC a quelques inconvénients pour les requêtes de mise à jour. Typiquement, les mises à jour nécessitent que les nouvelles versions des lignes soient ajoutées aux tables. Ceci peut aussi nécessiter de nouveaux enregistrements dans les index pour chaque ligne mise à jour, et la suppression des anciennes versions de lignes et des enregistrements d'index peut être très coûteuse.

Pour aider à réduire la surcharge impliquée par les 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érencée par les index de la table, ceci incluant les index d'expressions et les index partiels.

- Il y a suffisamment d'espace libre dans le bloc contenant l'ancienne version de la ligne mise à jour.

Dans de tels cas, les enregistements heap-only tuples fournissent deux optimisations :

- De nouveaux enregistrements d'index ne sont pas nécessaire pour représenter les lignes mises à jour.

- Les anciennes versions des lignes mises à jour peuvent être complètement supprimées lors des opérations normales, ceci incluant les `SELECT`, au lieu de nécessiter des opérations périodiques de nettoyage (vacuum). (C'est possible car les index ne référencent pas leurs identifiants d'éléments dans le bloc.)

En résumé, les mises à jour heap-only tuple peuvent seulement être créées si les colonnes utilisées par les index ne sont pas mises à jour. Vous pouvez augmenter la probabilité d'un espace de stockage suffisant pour les mises à jour HOT en réduisant le paramètre `fillfactor` d'une table. Si vous ne le faites pas, les mises à jour HOT surviendront toujours parce que les nouvelles lignes migreront naturellement vers de nouveaux blocs et des blocs existants avec suffisamment d'espace pour les nouvelles versions de ligne. La vue système pg_stat_all_tables permet la supervision de la réalisation de mises à jour HOT et non HOT.