Estoy tratando de hacer que PostgreSQL aspire mi base de datos de forma agresiva. Actualmente he configurado el vacío automático de la siguiente manera:
- autovacuum_vacuum_cost_delay = 0 # Apague el vacío basado en costos
- autovacuum_vacuum_cost_limit = 10000 # Valor máximo
- autovacuum_vacuum_threshold = 50 # Valor predeterminado
- autovacuum_vacuum_scale_factor = 0.2 # Valor predeterminado
Noté que el vacío automático solo se activa cuando la base de datos no está bajo carga, por lo que me meto en situaciones en las que hay muchas más tuplas muertas que tuplas vivas. Vea la captura de pantalla adjunta para ver un ejemplo. Una de las mesas tiene 23 tuplas vivas, pero 16845 tuplas muertas en espera de vacío. ¡Eso es una locura!
El vacío automático se activa cuando finaliza la ejecución de la prueba y el servidor de la base de datos está inactivo, que no es lo que quiero, ya que me gustaría que se activara el vacío automático cada vez que el número de tuplas muertas supere el 20% de tuplas vivas + 50, ya que la base de datos ha sido configurado El vacío automático cuando el servidor está inactivo es inútil para mí, ya que se espera que el servidor de producción alcance miles de actualizaciones / segundo durante un período prolongado, por lo que necesito el vacío automático para funcionar incluso cuando el servidor está bajo carga.
¿Hay algo que me falta? ¿Cómo fuerzo el vacío automático para que se ejecute mientras el servidor está bajo una carga pesada?
Actualizar
¿Podría ser esto un problema de bloqueo? Las tablas en cuestión son tablas de resumen que se completan mediante un desencadenador de inserción posterior. Estas tablas están bloqueadas en el modo COMPARTIR EXCLUSIVA DE LA FILA para evitar escrituras concurrentes en la misma fila.