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

73.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, ceci incluant les index fonctionnels et partiels.

  • 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.

  • Les anciennes versions des lignes mises à jour peuvent être complètement supprimées lors d'opérations normales, celles-ci incluant les SELECT, au lieu de nécessiter des opérations périodiques de nettoyage. (Ceci est possible parce que les index ne référencent par leurs identifiants d'éléments de bloc.)

En résumé, les mises à jour des 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 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.