PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como excluir muitas linhas da tabela acessada com frequência


  1. 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.)

  2. 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.

  3. 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, use CREATE 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 no DELETE .
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.