CONGELACIÓN DE VACÍO vs. VACIO COMPLETO

18

¿Alguien puede explicar la diferencia entre estos tipos de VACUUMPostgreSQL?

Leí el documento pero solo dice que FULLbloquea las mesas y FREEZE"congela" las tuplas. Creo que es lo mismo. ¿Me equivoco?

Christian Maíz
fuente
¿Has leído el documento? Esa sería una oportunidad perfecta para incluir un enlace a lo que has leído ...
Erwin Brandstetter

Respuestas:

12

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á.

Scott Marlowe
fuente
Entonces, ¿ VACUUM FREEZErequiere 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 ...
Parthian Shot
El vacío no se congela, el vacío completo sí.
Scott Marlowe
6

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 FREEZEque 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 FREEZEhan quedado en desuso y no deben usarse. En cambio, están los parámetros vacuum_freeze_table_agey autovacuum_freeze_max_ageeso especifica cuántas transacciones pueden ocurrir antes de que se realice un análisis completo en la tabla (efectivamente, haga un interno VACUUM FREEZEen la tabla).

Jimmy Stenke
fuente
3
¿Cómo es que los documentos no mencionan VACUUM FREEZEser desaprobado / desalentado?
dezso
Interesante. Lo hizo para las versiones entre 8.2 y 9.0. Quizás eliminaron la desaprobación porque podría ser una buena característica.
Jimmy Stenke
1

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.

Jayadevan
fuente
2
La pregunta pregunta VACUUM FREEZEen particular.
Erwin Brandstetter
Cierto - "diferencia entre este tipo de vacío en PostgreSQL" - Pensé que la pregunta era sobre las diferencias entre los tipos de vacío.
Jayadevan