Eu tenho um conjunto de dados antigo com muitos índices não utilizados. Eu gostaria de limpá-lo e trazê-lo de volta ao que parecia antes da adição de índices personalizados.
Existe uma maneira de descartar todos os índices, exceto os obrigatórios (como chaves primárias, restrições exclusivas etc.)?
Para obter uma lista:
db<>fique aqui
Isso funciona para o Postgres 14 . Versões futuras podem divergir.
Isso lista todos os índices que não são implementados por uma restrição (
PRIMARY
,UNIQUE
,EXCLUDE
) - verificado novamente com umLEFT JOIN
topg_constraint
para descartar qualquer conexão com qualquer restrição.Além disso, o índice não é usado para
CLUSTER
a tabela, nem para replicação.Mais detalhes no manual sobre pg_index .
Inspecione o resultado. Pode haver qualquer número de índices úteis entre os demais. Como colunas com
FOREIGN KEY
restrições de saída, onde um índice é opcional, mas frequentemente recomendado...Tem certeza? (Tem certeza que você tem certeza?)
Você pode soltar um por um ou usar este comando gerado para soltá-los todos de uma vez:
Se houver conexões simultâneas com o banco de dados, não use este comando-monstro, pois ele bloqueará todo o banco de dados, possivelmente por um longo período de tempo. E pode facilmente travar.
Aqui está minha versão de uma consulta para encontrar todos os índices não utilizados: