PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So löschen Sie viele Zeilen aus einer häufig aufgerufenen Tabelle

  1. Indizes sind in der Regel für Operationen auf 90 % aller Zeilen nutzlos. Sequentielle Scans sind so oder so schneller. (Exotische Ausnahmen gelten.)

  2. 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.

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