Estamos enfrentando muitas lentidão devido ao inchaço do índice. Ao tentar otimizar o índice, recriá-lo parece gerar um índice muito menor:
reviews_hotel_id_connection_id_review_date_created_at_review_id
: índice original
reviews_hotel_id_connection_id_review_date_created_at_new
: duplicata exata do índice original, recriado
reviews | reviews_hotel_id_connection_id_review_date_created_at_review_id | 5296 kB
reviews | reviews_hotel_id_connection_id_review_date_created_at_new | 2944 kB
O novo índice tem apenas 55% do tamanho do índice original!
A execução VACUUM ANALYSE reviews
não resulta em nenhuma redução de índice!
A execução VACUUM FULL reviews
faz com que o índice original tenha exatamente o mesmo tamanho que o novo índice:
reviews | reviews_hotel_id_connection_id_review_date_created_at_new | 2944 kB
reviews | reviews_hotel_id_connection_id_review_date_created_at_review_id | 2944 kB
Embora VACUUM FULL
bloqueie a tabela mesmo para leituras! É uma opção para otimizar índices sem causar tempo de inatividade?
VACUUM
normalmente não reduz as tabelas ou índices.A partir da v12, você pode usar
REINDEX CONCURRENTLY
para isso.Antes, você criava um segundo índice com
CREATE INDEX CONCURRENTLY
, depois descartava o índice antigo. Mas isso não funcionaria para um índice de restrição.Mas 50% de inchaço como neste caso é bastante normal e saudável para um índice de árvore b, e eu não me preocuparia com isso.