Para permitir una alta concurrencia, PostgreSQL utiliza el control de concurrencia multiversión (MVCC) para almacenar las filas. Sin embargo, MVCC tiene algunas desventajas para las consultas de actualización. Específicamente, las actualizaciones requieren que se añadan nuevas versiones de las filas a las tablas. Esto también puede requerir nuevas entradas de índice para cada fila actualizada, y la eliminación de las versiones antiguas de las filas y sus entradas de índice puede resultar costosa.
Para ayudar a reducir la sobrecarga de las actualizaciones, PostgreSQL tiene una optimización llamada tuplas solo en montón (HOT). Esta optimización es posible cuando:
La actualización no modifica ninguna columna referenciada por los índices de la tabla, sin incluir los índices de resumen. El único método de índice de resumen en la distribución principal de PostgreSQL es BRIN.
Hay suficiente espacio libre para la fila actualizada en la página que contiene la fila antigua.
En tales casos, las tuplas solo en montón proporcionan dos optimizaciones:
No se necesitan nuevas entradas de índice para representar las filas actualizadas; sin embargo, es posible que los índices de resumen aún deban actualizarse.
Cuando una fila se actualiza varias veces, las versiones de fila distintas de la más antigua y la más nueva se pueden eliminar por completo durante el
funcionamiento normal, incluidos los SELECTs, en lugar de requerir operaciones periódicas de vacuum. (Los índices siempre hacen referencia
al identificador de elemento de página de la versión de fila original. Los datos de la tupla asociados con esa
versión de fila se eliminan, y su identificador de elemento se convierte en un redireccionamiento que apunta a la versión más antigua que todavía puede ser
visible para alguna transacción concurrente. Las versiones de fila intermedias que ya no son visibles para nadie se eliminan por completo, y los identificadores
de elementos de página asociados se ponen a disposición para su reutilización).
Puedes aumentar la probabilidad de que haya suficiente espacio en la página para las actualizaciones HOT disminuyendo el fillfactor de una tabla. Si no lo haces, las actualizaciones HOT seguirán ocurriendo
porque las nuevas filas migrarán de forma natural a nuevas páginas y a páginas existentes con suficiente espacio libre para las versiones de filas nuevas.
La vista del sistema pg_stat_all_tables permite supervisar la ocurrencia de actualizaciones HOT
y no HOT.