sql >> Databáze >  >> RDS >> PostgreSQL

Jak mohu zlepšit výkon dotazů na základě data u velké tabulky?

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í:



  1. Jak aktualizovat dvě tabulky pomocí jediného příkazu JOIN na serveru MYSQL?

  2. Aplikace Rails na Heroku nemůže zapisovat do databáze PostgreSQL, pouze číst

  3. Jak provést INSERT Pass-Through Query v SQL Server

  4. Nechte se zapálit pomocí Apache Spark – část 1