sql >> Database >  >> RDS >> PostgreSQL

Hoe verbeter ik op datum gebaseerde queryprestaties voor een grote tabel?

Een gematerialiseerde weergave is de manier om te gaan voor wat je hebt geschetst. Het opvragen van alleen-lezen gegevens van de afgelopen maanden werkt zonder deze te vernieuwen. Misschien wilt u de huidige maand speciaal maken als u daar ook rekening mee moet houden.

De onderliggende zoekopdracht kan nog steeds profiteren van een index, en er zijn twee richtingen die u kunt volgen:

Ten eerste, gedeeltelijke indexen zoals je nu hebt, zal in jouw scenario niet veel kopen, niet de moeite waard. Als u nog veel meer maanden aan gegevens verzamelt en meestal per maand zoekt (en rijen per maand toevoegt / neerzet) tabelpartitionering is misschien een idee, dan heb je je indexen ook automatisch gepartitioneerd. Ik zou hiervoor Postgres 11 of zelfs de komende Postgres 12 overwegen.)

Als uw rijen breed zijn , maak een index die index-only scans toestaat . Vind ik leuk:

CREATE INDEX reportimpression_covering_idx ON reportimpression(datelocal, views, gender);

Gerelateerd:

Of INCLUDE extra kolommen in Postgres 11 of later:

CREATE INDEX reportimpression_covering_idx ON reportimpression(datelocal) INCLUDE (views, gender);

Anders , als uw rijen fysiek zijn gesorteerd op datelocal , overweeg dan een BRIN-index . Het is extreem klein en waarschijnlijk ongeveer net zo snel als een B-tree-index voor uw geval. (Maar omdat het zo klein is, blijft het veel gemakkelijker in de cache en worden er minder andere gegevens naar buiten gegooid.)

CREATE INDEX reportimpression_brin_idx ON reportimpression USING BRIN (datelocal);

Mogelijk bent u geïnteresseerd in CLUSTER of pg_repack om tabelrijen fysiek te sorteren. pg_repack kan het zonder exclusieve sloten op de tafel en zelfs zonder een btree-index (vereist door CLUSTER ). Maar het is een extra module die niet bij de standaarddistributie van Postgres wordt geleverd.

Gerelateerd:



  1. Laravel 4:meerdere waar met of in welsprekend

  2. 5 fouten bij het ontwerpen van databases die u moet vermijden

  3. Kan geen verbinding maken met mysql-server op AWS RDS

  4. ongeldig geheugenadres of nul pointer dereference golang-database