sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo eliminar muchas filas de la tabla de acceso frecuente

  1. Los índices suelen ser inútiles para operaciones en el 90% de todas las filas. Los escaneos secuenciales serán más rápidos de cualquier manera. (Se aplican excepciones exóticas).

  2. Si necesita permitir lecturas simultáneas, no puede tomar un bloqueo exclusivo en la tabla. Por lo tanto, tampoco puede eliminar ningún índice en la misma transacción.

  3. podrías elimine los índices en transacciones separadas para mantener la duración del bloqueo exclusivo al mínimo. En Postgres 9.2 o posterior, también puede usar DROP INDEX CONCURRENTEMENTE , que solo necesita bloqueos mínimos. Luego use CREATE INDEX CONCURRENTLY para reconstruir el índice en segundo plano, y solo tomar un bloqueo exclusivo muy breve.

Si tiene una condición estable para identificar el 10 % (o menos) de las filas que permanecen, sugeriría un índice parcial solo en esas filas para obtener lo mejor para ambos:

  • Las consultas de lectura pueden acceder a la tabla rápidamente (utilizando el índice parcial) en todo momento.
  • El gran DELETE no va a modificar el índice parcial en absoluto, ya que ninguna de las filas está involucrada en DELETE .
CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;

Asumiendo delete_flag es boolean . Debe incluir el mismo predicado en sus consultas (incluso si parece lógicamente redundante) para asegurarse de que Postgres pueda el índice parcial.