-
Index är vanligtvis värdelösa för operationer på 90 % av alla rader. Sekventiella skanningar kommer att gå snabbare i båda fallen. (Exotiska undantag gäller.)
-
Om du behöver tillåta samtidiga läsningar kan du inte ta ett exklusivt lås på bordet. Så du kan inte heller släppa några index i samma transaktion.
-
Du kunde släpp index i separata transaktioner för att hålla varaktigheten för det exklusiva låset på ett minimum. I Postgres 9.2 eller senare kan du också använda SLÄPP INDEX SAMTIDIGT , som bara behöver minimala låsningar. Använd senare
CREATE INDEX CONCURRENTLY
att bygga om indexet i bakgrunden - och bara ta ett mycket kort exklusivt lås.
Om du har ett stabilt tillstånd för att identifiera de 10 % (eller mindre) av raderna som stannar, skulle jag föreslå en partiellt index på bara dessa rader för att få det bästa för båda:
- Läsfrågor kan komma åt tabellen snabbt (med det partiella indexet) när som helst.
- Den stora
DELETE
kommer inte att modifiera det partiella indexet alls, eftersom ingen av raderna är involverade iDELETE
.
CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;
Förutsatt delete_flag
är boolean
. Du måste inkludera samma predikat i dina frågor (även om det verkar logiskt överflödigt) för att säkerställa att Postgres kan det partiella indexet.