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:
- De verwijdering van verweesde records in Postgres optimaliseren
- Hoe maak ik schijfruimte vrij na verwijdering zonder de tabel opnieuw te maken?