0Pricing
SQL Academy · Lección

MVCC y causas de la fragmentación

Comprenda el control de concurrencia multiversión, por qué se acumulan las tuplas muertas y cómo las transacciones largas provocan fragmentación.

MVCC y causas de la fragmentación es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.

¿Qué es MVCC?

Multi-Version Concurrency Control. En lugar de utilizar bloqueos, PostgreSQL mantiene varias versiones de una fila. Los lectores ven una instantánea coherente y los escritores crean nuevas versiones sin bloquear a los lectores.

Cómo funciona un UPDATE

Un UPDATE no cambia la fila en el mismo lugar:

  1. Marca la versión antigua de la fila como «muerta» en la transacción T
  2. Escribe una nueva versión
  3. Las demás transacciones ven la versión que permite su instantánea

Por qué se produce la fragmentación

Las versiones muertas se acumulan. La tabla crece aunque el número de filas permanezca estable. Sin limpieza, las consultas recorren progresivamente más filas muertas.

Cuándo VACUUM recupera espacio

VACUUM marca las filas muertas como reutilizables (dentro del archivo de la tabla). NO reduce el tamaño de los archivos a menos que estén completamente vacíos al final. VACUUM FULL reescribe la tabla: utiliza un bloqueo exclusivo y es lento.

Autovacuum

PostgreSQL ejecuta autovacuum en segundo plano. Se activa cuando las filas muertas superan un umbral:

autovacuum_vacuum_threshold = 50
autovacuum_vacuum_scale_factor = 0.2
-- vacuum when dead_rows > 50 + 0.2 * total_rows

Cargas de trabajo que causan fragmentación

  • Mucho tráfico de UPDATE en tablas pequeñas o muy activas
  • Grandes lotes de DELETE (VACUUM debe liberar el espacio)
  • Las transacciones de larga duración bloquean VACUUM (mantienen instantáneas)
  • Las sesiones inactivas dentro de una transacción acumulan filas muertas en tablas con mucha actividad

Diagnosticar la fragmentación

La extensión pgstattuple proporciona cifras exactas:

CREATE EXTENSION pgstattuple;

SELECT * FROM pgstattuple('orders');
-- table_len, tuple_count, dead_tuple_count, free_space, etc.

SELECT * FROM pgstatindex('orders_user_id_idx');

Las transacciones largas bloquean VACUUM

VACUUM solo puede limpiar las filas más antiguas que la transacción activa más antigua. Una sesión inactiva dentro de una transacción durante 4 horas implica 4 horas de filas muertas sin reclamar.

SELECT pid, state, xact_start, NOW() - xact_start AS duration
FROM pg_stat_activity
WHERE state IN ('active', 'idle in transaction')
ORDER BY duration DESC NULLS LAST;

Protección frente al desbordamiento

Los identificadores de transacción tienen 32 bits. Si autovacuum no puede mantener el ritmo, el clúster se enfrenta a un «wraparound» y entra en modo de seguridad (VACUUM forzado). Supervise:

SELECT datname, age(datfrozenxid) FROM pg_database
ORDER BY age(datfrozenxid) DESC;

Eliminación lógica ≠ física

DELETE marca las filas como muertas; el espacio solo se puede recuperar mediante VACUUM. Los DELETE masivos sin un VACUUM posterior dejan enormes conjuntos de filas muertas.

Actualizaciones HOT

Si actualiza únicamente columnas no indexadas y hay espacio libre en la misma página, PostgreSQL realiza una actualización HOT (Heap-Only Tuple): no modifica el índice y produce menos fragmentación.

Reducir la fragmentación

  • Mantenga las transacciones cortas
  • Evite los UPDATE amplios en columnas indexadas (HOT no puede activarse)
  • Ajuste autovacuum de forma agresiva en las tablas con mucha actividad
  • Use pg_repack para reescribir sin bloqueos prolongados

Resumen

MVCC permite la concurrencia a cambio de acumular filas muertas.

  • VACUUM limpia las filas muertas
  • Autovacuum es esencial: no lo desactive
  • Las transacciones prolongadas bloquean la limpieza
  • Diagnostique con pgstattuple

Comprobación rápida

¿Por qué un UPDATE no reduce el tamaño de la tabla aunque solo cambie una columna?

Preguntas frecuentes

¿La lección «MVCC y causas de la fragmentación» es gratis?

Sí — el texto completo de «MVCC y causas de la fragmentación» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.

¿Qué aprenderé en «MVCC y causas de la fragmentación»?

Comprenda el control de concurrencia multiversión, por qué se acumulan las tuplas muertas y cómo las transacciones largas provocan fragmentación. Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar SQL Academy?

No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «MVCC y causas de la fragmentación»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de SQL Academy?

Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. MVCC y causas de la fragmentación
  2. VACUUM, autovacuum, vacuum_cost_delay
  3. ANALYZE y pg_statistic
  4. Escaneos solo de índice y mapa de visibilidad
← Volver a SQL Academy