materializované zobrazení je způsob, jak jít za tím, co jste nastínili. Dotazování na data pouze pro čtení za poslední měsíce funguje bez jejich obnovování. Možná budete chtít speciální případ aktuálního měsíce, pokud potřebujete pokrýt i to.
Základní dotaz může stále těžit z indexu a existují dva směry, kterými se můžete vydat:
Za prvé, částečné indexy jako máte nyní, ve vašem scénáři toho moc nekoupíte, nestojí to za to. Pokud shromažďujete mnohem více měsíců dat a většinou se dotazujete po měsíci (a přidáváte/vynecháváte řádky po měsíci), rozdělení tabulky může být nápad, pak máte také automaticky rozdělené indexy. Zvažoval bych za to Postgres 11 nebo dokonce nadcházející Postgres 12.)
Pokud jsou vaše řádky široké , vytvořte index, který umožňuje skenování pouze s indexem . Jako:
CREATE INDEX reportimpression_covering_idx ON reportimpression(datelocal, views, gender);
Související:
Nebo INCLUDE
další sloupce v Postgresu 11 nebo novějším:
CREATE INDEX reportimpression_covering_idx ON reportimpression(datelocal) INCLUDE (views, gender);
Jinak , pokud jsou vaše řádky fyzicky seřazeny podle datelocal
, zvažte index BRIN
. Je extrémně malý a pravděpodobně tak rychlý jako index B-stromu pro váš případ. (Ale protože je tak malý, bude mnohem snazší zůstat v mezipaměti a nebude tolik vytlačovat jiná data.)
CREATE INDEX reportimpression_brin_idx ON reportimpression USING BRIN (datelocal);
Mohlo by vás zajímat CLUSTER
nebo pg_repack
k fyzickému řazení řádků tabulky. pg_repack
může to udělat bez exkluzivních zámků na stole a dokonce bez indexu btree (vyžadováno CLUSTER
). Ale je to přídavný modul, který není dodáván se standardní distribucí Postgres.
Související:
- Optimalizujte Postgres mazání osiřelých záznamů
- Jak získat zpět místo na disku po odstranění bez opětovného sestavení tabulky?