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

Konfigurační parametr work_mem v PostgreSQL na Linuxu

Zveřejnil jsem váš plán dotazů na explain.depesz.com, podívejte se.

Odhady plánovače dotazů jsou na některých místech velmi chybné. Spustili jste ANALYZE nedávno?

Přečtěte si kapitoly v příručce Statistiky používané plánovačem a Konstanty nákladů plánovače. Věnujte zvláštní pozornost kapitolám o random_page_cost a default_statistics_target .
Můžete zkusit:

ALTER TABLE diplomas ALTER COLUMN number SET STATISTICS 1000;
ANALYZE diplomas;

Nebo jděte ještě výš pro stůl s 10M řádky. Záleží na distribuci dat a skutečných dotazech . Experiment. Výchozí hodnota je 100, maximum je 10 000.

Pro databázi této velikosti stačí 1 nebo 5 MB work_mem obecně nestačí. Přečtěte si stránku Postgres Wiki na Tuning Postgres, na kterou odkazoval @aleroot.

Protože váš dotaz potřebuje 430104 kB paměti na disku podle EXPLAIN výstup, musíte nastavit work_mem na něco jako 500 MB nebo více pro umožnění třídění v paměti. Reprezentace dat v paměti vyžaduje o něco více prostoru než reprezentace na disku. Možná vás bude zajímat, co k této záležitosti nedávno zveřejnil Tom Lane.

Zvyšování work_mem jen trochu, jak jste se snažil, moc nepomůže nebo může dokonce zpomalit. Nastavení na vysokou globálně může dokonce ublížit, zejména při souběžném přístupu. Více relací se může navzájem hladovět o zdroje. Přidělení více pro jeden účel odebírá paměť jinému, pokud je zdroj omezený. Nejlepší nastavení závisí na celkové situaci.

Abyste se vyhnuli vedlejším účinkům, nastavte dostatečně vysokou hodnotu pouze lokálně v relaci a dočasně pro dotaz:

SET work_mem = '500MB';

Poté jej resetujte na výchozí:

RESET work_mem;

Nebo použijte SET LOCAL nastavte jej pouze pro aktuální transakci.



  1. Neočekávaný vedlejší účinek přidání filtrovaného indexu

  2. 3 způsoby, jak spočítat počet systémových tabulek v databázi SQL Server

  3. Oracle SQL:časová razítka v klauzuli where

  4. Jak přidat komentáře do tabulky v Oracle SQL Developer?