Estou tentando fazer com que o PostgreSQL aspire automaticamente meu banco de dados de forma agressiva. No momento, configurei o aspirador automático da seguinte maneira:
- autovacuum_vacuum_cost_delay = 0 #Desativar vácuo baseado em custo
- autovacuum_vacuum_cost_limit = 10000 # Valor máximo
- autovacuum_vacuum_threshold = 50 # Valor padrão
- autovacuum_vacuum_scale_factor = 0.2 # Valor padrão
Percebo que o aspirador automático só entra em ação quando o banco de dados não está carregado, então entro em situações em que existem muito mais tuplas mortas do que tuplas vivas. Veja a captura de tela em anexo para um exemplo. Uma das tabelas possui 23 tuplas ao vivo, mas 16845 tuplas mortas aguardando vácuo. Isso é insano!
O vácuo automático entra em ação quando a execução do teste termina e o servidor de banco de dados está ocioso, o que não é o que eu quero, pois eu gostaria que o vácuo automático fosse ativado sempre que o número de tuplas mortas exceder 20% de tuplas ativas + 50, pois o banco de dados foi desativado. configurado. O aspirador automático quando o servidor está ocioso é inútil para mim, pois o servidor de produção deve atingir milhares de atualizações / s por um período prolongado e é por isso que preciso que o aspirador automático seja executado mesmo quando o servidor estiver sob carga.
Falta alguma coisa? Como forço a execução do vácuo automático enquanto o servidor está sob carga pesada?
Atualizar
Isso pode ser um problema de bloqueio? As tabelas em questão são tabelas de resumo que são preenchidas por meio de um gatilho após inserção. Essas tabelas estão bloqueadas no modo SHARE ROW EXCLUSIVE para impedir gravações simultâneas na mesma linha.