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.