-
Gli indici sono in genere inutili per le operazioni sul 90% di tutte le righe. Le scansioni sequenziali saranno più veloci in entrambi i casi. (Si applicano eccezioni esotiche.)
-
Se devi consentire letture simultanee, non puoi prendere un blocco esclusivo sul tavolo. Quindi non puoi nemmeno rilasciare indici nella stessa transazione.
-
Potresti rilasciare gli indici in transazioni separate per mantenere al minimo la durata del blocco esclusivo. In Postgres 9.2 o versioni successive puoi anche utilizzare DROP INDEX CONTEMPORANEAMENTE , che necessita solo di blocchi minimi. Successivamente usa
CREATE INDEX CONCURRENTLY
per ricostruire l'indice in background - e prendere solo un brevissimo blocco esclusivo.
Se si dispone di una condizione stabile per identificare il 10 % (o meno) di righe che rimangono, suggerirei un indice parziale solo su quelle righe per ottenere il meglio per entrambi:
- Le query di lettura possono accedere alla tabella rapidamente (utilizzando l'indice parziale) in qualsiasi momento.
- Il grande
DELETE
non modificherà affatto l'indice parziale, poiché nessuna delle righe è coinvolta nelDELETE
.
CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;
Assumendo delete_flag
è boolean
. Devi includere lo stesso predicato nelle tue query (anche se sembra logicamente ridondante) per assicurarti che Postgres possa eseguire l'indice parziale.