PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come eliminare molte righe dalla tabella a cui si accede di frequente

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

  2. Se devi consentire letture simultanee, non puoi prendere un blocco esclusivo sul tavolo. Quindi non puoi nemmeno rilasciare indici nella stessa transazione.

  3. 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 nel DELETE .
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.