sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man tar bort många rader från ofta besökta tabeller

  1. 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.)

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

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



  1. ORACLE 10g :To_date() Inte en giltig månad

  2. Använder UDF för standardvärdet för en kolumn

  3. Oracle 11g - Kör PL/SQL-markörer

  4. Simulerad OLAP