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.