sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan sletter du mange rækker fra ofte tilgået tabel

  1. Indekser er typisk ubrugelige til operationer på 90 % af alle rækker. Sekventielle scanninger vil være hurtigere på begge måder. (Eksotiske undtagelser gælder.)

  2. Hvis du har brug for at tillade samtidige læsninger, kan du ikke tage en eksklusiv lås på bordet. Så du kan heller ikke droppe nogen indekser i den samme transaktion.

  3. Du kunne droppe indekser i separate transaktioner for at holde varigheden af ​​den eksklusive lås på et minimum. I Postgres 9.2 eller nyere kan du også bruge DROP INDEKS SAMMELIGT , som kun behøver minimale låse. Brug senere CREATE INDEX CONCURRENTLY at genopbygge indekset i baggrunden - og kun tage en meget kort eksklusiv lås.

Hvis du har en stabil tilstand til at identificere de 10 % (eller mindre) af rækker, der forbliver, vil jeg foreslå en delvis indeks på netop disse rækker for at få det bedste for begge:

  • Læseforespørgsler kan til enhver tid få adgang til tabellen (ved hjælp af det delvise indeks).
  • Den store DELETE kommer ikke til at ændre det delvise indeks overhovedet, da ingen af ​​rækkerne er involveret i DELETE .
CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;

Forudsat delete_flag er boolean . Du skal inkludere det samme prædikat i dine forespørgsler (selvom det virker logisk overflødigt) for at sikre, at Postgres kan det delvise indeks.



  1. Opretter forbindelse til Oracle DB ved hjælp af Ruby

  2. Indtastningstype tekstfelt giver rettet fejl 2147483647

  3. mysql søg efter segment af tabelnavn

  4. Løsning af problemet med SQLinjection