-
Indekser er typisk ubrugelige til operationer på 90 % af alle rækker. Sekventielle scanninger vil være hurtigere på begge måder. (Eksotiske undtagelser gælder.)
-
Hvis du har brug for at tillade samtidige læsninger, kan du ikke tage en eksklusiv lås på bordet. Så du kan heller ikke droppe nogen indekser i den samme transaktion.
-
Du kunne droppe indekser i separate transaktioner for at holde varigheden af den eksklusive lås på et minimum. I Postgres 9.2 eller nyere kan du også bruge DROP INDEKS SAMMELIGT , som kun behøver minimale låse. Brug senere
CREATE INDEX CONCURRENTLY
at genopbygge indekset i baggrunden - og kun tage en meget kort eksklusiv lås.
Hvis du har en stabil tilstand til at identificere de 10 % (eller mindre) af rækker, der forbliver, vil jeg foreslå en delvis indeks på netop disse rækker for at få det bedste for begge:
- Læseforespørgsler kan til enhver tid få adgang til tabellen (ved hjælp af det delvise indeks).
- Den store
DELETE
kommer ikke til at ændre det delvise indeks overhovedet, da ingen af rækkerne er involveret iDELETE
.
CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;
Forudsat delete_flag
er boolean
. Du skal inkludere det samme prædikat i dine forespørgsler (selvom det virker logisk overflødigt) for at sikre, at Postgres kan det delvise indeks.