-
Indexen zijn doorgaans nutteloos voor bewerkingen op 90% van alle rijen. Sequentiële scans zullen hoe dan ook sneller zijn. (Exotische uitzonderingen zijn van toepassing.)
-
Als u gelijktijdige leesbewerkingen moet toestaan, kunt u geen exclusief slot op tafel nemen. U kunt dus ook geen indexen in dezelfde transactie laten vallen.
-
Je zou laat indexen in afzonderlijke transacties vallen om de duur van de exclusieve vergrendeling tot een minimum te beperken. In Postgres 9.2 of hoger kunt u ook DROP INDEX GELIJKTIJDIG gebruiken , die slechts minimale sloten nodig heeft. Gebruik later
CREATE INDEX CONCURRENTLY
om de index op de achtergrond opnieuw te bouwen - en slechts een zeer korte exclusieve vergrendeling te nemen.
Als je een stabiele conditie hebt om de 10% (of minder) rijen te identificeren die blijven, raad ik een gedeeltelijke index op alleen die rijen om het beste voor beide te krijgen:
- Leesquery's hebben te allen tijde snel toegang tot de tabel (met behulp van de gedeeltelijke index).
- De grote
DELETE
gaat de gedeeltelijke index helemaal niet wijzigen, aangezien geen van de rijen betrokken is bij deDELETE
.
CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;
Ervan uitgaande dat delete_flag
is boolean
. U moet hetzelfde predikaat in uw zoekopdrachten opnemen (zelfs als het logisch overbodig lijkt) om ervoor te zorgen dat Postgres de gedeeltelijke index kan gebruiken.