-
Indizes sind in der Regel für Operationen auf 90 % aller Zeilen nutzlos. Sequentielle Scans sind so oder so schneller. (Exotische Ausnahmen gelten.)
-
Wenn Sie gleichzeitige Lesevorgänge zulassen müssen, können Sie die Tabelle nicht exklusiv sperren. Sie können also auch keine Indizes in derselben Transaktion löschen.
-
Sie könnten Löschen Sie Indizes in separaten Transaktionen, um die Dauer der exklusiven Sperre so gering wie möglich zu halten. In Postgres 9.2 oder höher können Sie auch DROP INDEX CONCURRENTLY verwenden , die nur minimale Sperren benötigt. Verwenden Sie später
CREATE INDEX CONCURRENTLY
um den Index im Hintergrund neu aufzubauen - und nur eine sehr kurze exklusive Sperre zu nehmen.
Wenn Sie einen stabilen Zustand haben, um die 10 % (oder weniger) der verbleibenden Zeilen zu identifizieren, würde ich einen Teilindex nur in diesen Zeilen, um das Beste für beide zu erhalten:
- Lesende Abfragen können jederzeit schnell auf die Tabelle zugreifen (unter Verwendung des Teilindex).
- Das große
DELETE
wird den partiellen Index überhaupt nicht ändern, da keine der Zeilen inDELETE
involviert ist .
CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;
Angenommen delete_flag
ist boolean
. Sie müssen dasselbe Prädikat in Ihre Abfragen aufnehmen (auch wenn es logisch redundant erscheint), um sicherzustellen, dass Postgres den Teilindex ausführen kann.