En materialiseret visning er vejen at gå for det, du har skitseret. At forespørge sidste måneders skrivebeskyttede data fungerer uden at opdatere dem. Det kan være en god ide at angive den aktuelle måned, hvis du også har brug for at dække det.
Den underliggende forespørgsel kan stadig drage fordel af et indeks, og der er to retninger, du kan tage:
Først delvise indekser som du har nu vil ikke købe meget i dit scenario, ikke det værd. Hvis du indsamler mange flere måneders data og for det meste forespørger efter måned (og tilføjer/slip rækker efter måned) tabelpartitionering kan være en idé, så har du også dine indekser opdelt automatisk. Jeg ville dog overveje Postgres 11 eller endda den kommende Postgres 12 til dette.)
Hvis dine rækker er brede , opret et indeks, der tillader scanninger kun for indeks . Ligesom:
CREATE INDEX reportimpression_covering_idx ON reportimpression(datelocal, views, gender);
Relateret:
Eller INCLUDE
yderligere kolonner i Postgres 11 eller nyere:
CREATE INDEX reportimpression_covering_idx ON reportimpression(datelocal) INCLUDE (views, gender);
Andet , hvis dine rækker er fysisk sorteret efter datelocal
, overvej et BRIN-indeks
. Det er ekstremt lille og sandsynligvis omtrent lige så hurtigt som et B-træ-indeks for din sag. (Men da den er så lille, forbliver den meget lettere i cachen og ikke skubbe andre data så meget ud.)
CREATE INDEX reportimpression_brin_idx ON reportimpression USING BRIN (datelocal);
Du kan være interesseret i CLUSTER
eller pg_repack
til fysisk at sortere tabelrækker. pg_repack
kan gøre det uden eksklusive låse på bordet og endda uden et btree-indeks (påkrævet af CLUSTER
). Men det er et ekstra modul, der ikke leveres med standarddistributionen af Postgres.
Relateret:
- Optimize Postgres-sletning af forældreløse poster
- Hvordan genvinder man diskplads efter sletning uden at genopbygge tabellen?