¿Alguien puede explicar la diferencia entre estos tipos de VACUUM
PostgreSQL?
Leí el documento pero solo dice que FULL
bloquea las mesas y FREEZE
"congela" las tuplas. Creo que es lo mismo. ¿Me equivoco?
¿Alguien puede explicar la diferencia entre estos tipos de VACUUM
PostgreSQL?
Leí el documento pero solo dice que FULL
bloquea las mesas y FREEZE
"congela" las tuplas. Creo que es lo mismo. ¿Me equivoco?
Respuestas:
Aquí hay una respuesta breve y concisa.
Vacío lleno saca un bloqueo exclusivo y reconstruye la tabla para que no tenga bloques vacíos (por ahora, pretendemos que el factor de relleno es del 100%).
La congelación de vacío marca el contenido de una tabla con una marca de tiempo de transacción muy especial que le dice a postgres que nunca necesita ser aspirado. La próxima actualización de esta identificación congelada desaparecerá.
Por ejemplo, la base de datos template0 está congelada porque nunca cambia (de forma predeterminada no puede conectarse a ella).
De vez en cuando, el demonio de autovacuum verificará una base de datos y sus tablas para ver qué necesita ser aspirado. Si una tabla se congela al vacío y luego nunca se actualiza, el demonio de vacío automático simplemente la pasará por alto. Además, la protección "envolvente" en postgresql nunca entrará en acción en esa tabla tampoco.
tl; dr freezing marca una tabla como que no necesita ningún mantenimiento de autovac. La próxima actualización lo descongelará.
VACUUM FREEZE
requiere un bloqueo exclusivo en la mesa? Parece que debería, de lo contrario correría el riesgo de hacer visibles de forma global filas de transacciones activas a nivel mundial. Podría estar malinterpretándolo ...
Para explicar más a fondo lo que escribió Jayadevan.
La forma en que Postgres trabaja con las transacciones y para realizar un seguimiento de los datos visibles es mediante la comparación de ID de transacciones internas. Sin embargo, dado que esas transacciones son un número entero de 32 bits, tarde o temprano se ajustarán y, por lo tanto, la nueva transacción parecerá que se realizó en el pasado (y, por lo tanto, será visible en una transacción actual mientras no debería), mientras que Las transacciones más antiguas parecerán que se están haciendo en el futuro (y dado que el futuro aún no existe, esos datos ya no serán visibles).
Lo que hace Postgres para contrarrestar ese problema es asignar a cada fila que tenga la edad suficiente para correr el riesgo de sufrir esta envoltura una identificación de transacción especial que siempre es más antigua que cada transacción. Puede verlo como si los identificadores de transacción válidos varían de 0 a 2147483647, establecerá la identificación de la transacción para todas las filas actuales en -1.
Sin embargo, dado que el vacío es básicamente para marcar el espacio vacío para su reutilización, solo funciona en páginas de datos que se han cambiado.
Lo VACUUM FREEZE
que se hace básicamente es congelar la identificación de la transacción para todas las páginas, sin importar si se han modificado o no, para que todas las filas actuales se vean como antiguas para todas las transacciones nuevas.
Sin embargo, a partir de la versión 8.2 VACUUM FREEZE
han quedado en desuso y no deben usarse. En cambio, están los parámetros vacuum_freeze_table_age
y autovacuum_freeze_max_age
eso especifica cuántas transacciones pueden ocurrir antes de que se realice un análisis completo en la tabla (efectivamente, haga un interno VACUUM FREEZE
en la tabla).
VACUUM FREEZE
ser desaprobado / desalentado?
Copie / pegue de la respuesta cuando hice la misma pregunta: "el vacío regular marca el espacio vacío para su reutilización y reclama el espacio vacío al final de una relación. Entonces, si el espacio vacío está en el medio, etc., no puede ser reclamado solo reutilizado.
vacío lleno compacta una relación reclamando todo el espacio vacío. Requiere un bloqueo exclusivo y es malo para los sistemas de producción en general debido a esto.
Por lo tanto, el propósito del vacío REGULAR no es recuperar espacio de las tablas, sino ponerlo a disposición para su reutilización posterior. El propósito del vacío FULL es recuperar todo el espacio desperdiciado a expensas de un bloqueo exclusivo y un rendimiento de db mientras ocurre.
Por lo tanto, dado que el vacío regular no está diseñado para recuperar todo, no debería sorprenderse de que, de hecho, no lo haya recuperado todo. Pruebe su experimento en conjuntos de datos más grandes con más eliminaciones aleatorias, etc. para ver la diferencia entre el vacío regular y el completo ".
http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html
Para agregar a esto, el vacío completo creará realmente nuevos archivos para la tabla (los archivos existentes se habrían reducido a un tamaño de 0). Por lo tanto, el sistema operativo puede reclamar el espacio.
VACUUM FREEZE
en particular.