[Pgsql-ayuda] Sobre vacuum

Alvaro Herrera alvherre@dcc.uchile.cl
Tue, 3 Feb 2004 22:29:58 -0300


On Tue, Feb 03, 2004 at 01:05:05PM +0000, Edwin Quijada wrote:
> Tengo un script que cada dos dias ejecuta un vacumm full , es mejor hacer 
> un vacuum full o un vacumm analyze ?

Son distintos.

Existen dos tipos de VACUUM: "full" y "no full", este último también
conocido como "lazy".

Además de una de esas dos modalidades, puedes indicarle a VACUUM que
haga recolección de estadísticas.  Para esto, agregas la palabra
ANALYZE.

La diferencia entre full vacuum y lazy vacuum es que tan intensivo es su
trabajo.  Full vacuum compacta completamente las tablas, recupera todo
el espacio libre que pueda haber en cada página, y libera el espacio
libre que quede al final de la tabla (==> el o los archivos en disco se
hacen más pequeños).  Para poder hacer esto, necesita tomar un candado
exclusivo sobre la tabla, por lo que no puedes ejecutar ninguna otra
operación concurrentemente.

Lazy vacuum, en cambio, sólo recupera el espacio libre dentro de cada
página.  No se mueven registros de una página a otra, y por lo tanto es
muy poco lo que se puede acortar el archivo en disco.  El espacio libre
que queda en cada página se registra en el Mapa de espacio libre, o FSM
(en inglés "free space map", el término por el que Martín Marqués
preguntaba hace unos días).  Este mapa, que se guarda en memoria, es de
tamaño limitado (configurable), por lo que no se guardan todas las
páginas de todas las tablas que tienen algún espacio libre; sólo las que
tienen más espacio.  Cada vez que ingresas un nuevo registro o
actualizas uno existente, se busca espacio libre en el FSM.

Por este motivo, es importante que el FSM tenga espacio suficiente para
mantener registros de todas tus tablas.  Verifica la configuración de
los parámetros "max_fsm_relations" y "max_fsm_pages".


Sugerencia: ejecuta VACUUM (lazy vacuum) con mucha frecuencia, de manera
que tu espacio libre se registre lo antes posible en las tablas que
tienen mucho movimiento.  Trata de encontrar una configuración que
permita que el espacio libre registrado sea suficiente para mantener la
cantidad de UPDATE/INSERT que efectúas en cada tabla.  Idealmente, no
necesitas ejecutar full vacuum si consigues este equilibrio.

Alternativa: usa pg_autovacuum.

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"La experiencia nos dice que el hombre peló millones de veces las patatas,
pero era forzoso admitir la posibilidad de que en un caso entre millones,
las patatas pelarían al hombre" (Ijon Tichy)