-
Os índices geralmente são inúteis para operações em 90% de todas as linhas. As varreduras sequenciais serão mais rápidas de qualquer maneira. (Exceções exóticas se aplicam.)
-
Se você precisar permitir leituras simultâneas, não poderá obter um bloqueio exclusivo na tabela. Portanto, você também não pode descartar nenhum índice na mesma transação.
-
Você poderia descarte índices em transações separadas para manter a duração do bloqueio exclusivo no mínimo. No Postgres 9.2 ou posterior, você também pode usar DROP INDEX CONCURRENTLY , que precisa apenas de bloqueios mínimos. Mais tarde, useCREATE INDEX CONCURRENTLY
para reconstruir o índice em segundo plano - e fazer apenas um bloqueio exclusivo muito breve.
Se você tiver uma condição estável para identificar os 10% (ou menos) de linhas que permanecem, sugiro um índice parcial apenas nessas linhas para obter o melhor para ambos:
- As consultas de leitura podem acessar a tabela rapidamente (usando o índice parcial) o tempo todo.
- O grande
DELETE
não vai modificar o índice parcial, pois nenhuma das linhas está envolvida noDELETE
.
CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;
Assumindo
delete_flag
é boolean
. Você precisa incluir o mesmo predicado em suas consultas (mesmo que pareça logicamente redundante) para garantir que o Postgres possa o índice parcial.