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.