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.