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