La parte que más odiamos de PostgreSQL
- PostgreSQL se ha consolidado como el DBMS más querido en internet durante los últimos 5 años. Esto se debe a su confiabilidad, funcionalidad, escalabilidad y a que es adecuado para la mayoría de las cargas de trabajo operativas.
- Sin embargo, su implementación del control de concurrencia multiversión (MVCC) es considerada la peor en comparación con otros DBMS relacionales.
¿Qué es el control de concurrencia multiversión?
- El objetivo de MVCC es permitir que varias consultas lean y escriban en la base de datos al mismo tiempo sin interferir entre sí.
- El DBMS mantiene múltiples versiones en lugar de sobrescribir la fila existente, y las consultas eligen la versión adecuada para satisfacer la solicitud.
- Este enfoque elimina la necesidad de bloqueos explícitos de registros y permite que las consultas observen una instantánea de la base de datos.
El control de concurrencia multiversión de PostgreSQL
- Cuando PostgreSQL actualiza una fila existente, usa un método de almacenamiento de versiones append-only que crea una nueva versión para aplicar los cambios.
- Este enfoque provoca varios problemas complejos.
Almacenamiento multiversión
- PostgreSQL almacena todas las versiones de una fila en el mismo espacio de almacenamiento.
- Al actualizar, asigna un nuevo slot de versión, copia la versión existente y aplica los cambios.
- PostgreSQL usa una cadena de versiones para registrar la relación entre versiones.
Vacuum de versiones
- PostgreSQL usa un proceso de vacuum para eliminar versiones antiguas.
- El autovacuum se ejecuta periódicamente para eliminar versiones expiradas y reutilizar el espacio.
Por qué el MVCC de PostgreSQL es el peor
- La implementación de MVCC en PostgreSQL es un diseño de los años 80 y no encaja con los patrones modernos de sistemas log-structured.
- Se explican cuatro problemas principales que surgen del MVCC de PostgreSQL.
Problema 1: copia de versiones
- PostgreSQL copia todas las columnas a la nueva versión, lo que incrementa la duplicación de datos y los requisitos de almacenamiento.
- MySQL y Oracle evitan este problema almacenando deltas.
Problema 2: hinchamiento de tablas
- Las versiones expiradas de PostgreSQL ocupan espacio y, si el autovacuum no logra eliminarlas, la base de datos sigue creciendo.
- Esto degrada el rendimiento de las consultas.
Problema 3: mantenimiento de índices secundarios
- PostgreSQL debe actualizar todos los índices en cada actualización.
- Esto degrada el rendimiento de las consultas.
Problema 4: gestión de vacuum
- El rendimiento de PostgreSQL depende en gran medida de la eficacia del autovacuum.
- Si el autovacuum no funciona correctamente, aparecen problemas de rendimiento.
Resumen de GN⁺
- PostgreSQL sigue siendo un DBMS muy querido, pero su implementación de MVCC no es moderna.
- Resolver los problemas de MVCC de PostgreSQL requiere mucho tiempo y esfuerzo.
- Se puede mejorar el rendimiento optimizando la configuración de autovacuum de PostgreSQL.
- Como alternativas para resolver los problemas de MVCC de PostgreSQL, se pueden considerar MySQL y Oracle.
1 comentarios
Comentarios de Hacker News
OrioleDB intentó resolver el problema con un nuevo motor de almacenamiento
INSERT, no se requiere espacio adicionalCOPY FROMEl diseño de PostgreSQL no es malo en todos los aspectos
gitno almacena diffs y, de forma similar a PostgreSQL, guarda el objeto completoLa implementación de MVCC en Oracle y MySQL no almacena la dirección física de la nueva versión
Al actualizar una sola fila en MySQL,
SELECT id WHERE something; UPDATE what WHERE id=ides mucho más rápidoEn la década de 2010, MongoDB fue visto como "webscale" debido a las escrituras no durables
No está de acuerdo con la explicación sobre
pg_repackVACUUM FULLes pesado, pero repack es una alternativa más rápida y livianaPostgreSQL ganó popularidad por las siguientes razones
Existe la pregunta de si el almacenamiento completo de nuevas versiones de tuplas-fila en PostgreSQL es una propiedad del motor de almacenamiento predeterminado
El artículo estaba bien escrito y era fácil de leer y entender