Vamos supor que uma tabela foo
se tornou elegível para análise de autovacuum, por exemplo, eu inseri um número de linhas foo
que excede autovacuum_analyze_scale_factor * number of rows + autovacuum_analyze_threshold
o limite efetivo. Não consigo descobrir quais são as condições que devem ser satisfeitas para que o autovacuum execute a análise no foo
.
A análise de autovacuum será executada para a tabela foo
somente se não houver transações? Ou ele pode ser executado mesmo durante transações ativas com as condições que: (1) nenhuma transação está lendo uma versão anterior da tabela foo
e (2) a análise de autovacuum pode ganhar SHARE UPDATE EXCLUSIVE
bloqueio na tabela foo
?
Estas questões estão relacionadas com o caso particular. Eu executo um número significativo de INSERTs foo
em uma transação e, em seguida, alguns UPDATEs foo
em uma segunda transação. Eu preciso que a análise de autovacuum seja executada antes da 2ª transação para ter estatísticas atualizadas foo
para melhores estimativas do meu planejador de consultas. Existe uma maneira de garantir que a análise de autovacuum seja executada antes da 2ª transação? Talvez para dormir (estou executando as duas transações do aplicativo Java) alguns milissegundos entre as transações?
A fórmula está correta.
O número de linhas ativas é obtido da
reltuples
coluna empg_class
, e o resultado da fórmula é comparado comn_mod_since_analyze
depg_stat_all_tables
.Observe que
autovacuum_analyze_scale_factor
eautovacuum_analyze_threshold
pode ser substituído por parâmetros de armazenamento na tabela.Se todos os trabalhadores de autovacuum disponíveis estiverem em execução (
autovacuum_max_workers
), talvez seja necessário aguardar.Analyze só tem um
ACCESS SHARE
bloqueio na tabela (só lê), então ele pode ser executado simultaneamente com quase tudo. Como umaSELECT
instrução, ele verá as linhas que são visíveis para ele.Se você precisar que uma tabela seja analisada entre an
INSERT
e anUPDATE
, não espere a execução da análise automática. Comece explicitamenteANALYZE
na mesa.