sql >> Database >  >> RDS >> PostgreSQL

Hoe veel rijen uit een veelgebruikte tabel te verwijderen

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

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

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



  1. MySQL - MINST en GROOTSTE vergelijkingsoperators

  2. Hoe maak je een json-formaat met group-concat mysql?

  3. Laravel 'Gebruiker'-model zonder id-kolom

  4. Hoe een mysql-database bijwerken via sms-berichten?