Některé problémy vyčnívají:
Nejprve zvažte upgrade na aktuální verzi Postgres . V době psaní tohoto článku je to str. 9.6 nebo str. 10 (aktuálně beta). Od Pg 9.4 došlo k několika vylepšením indexů GIN, dodatečného modulu pg_trgm a velkých dat obecně.
Dále potřebujete mnohem více RAM , zejména vyšší work_mem
nastavení. Poznám to z tohoto řádku v EXPLAIN
výstup:
Heap Blocks: exact=7625 lossy=223807
"ztrátové" v podrobnostech pro Skenování bitmapové haldy (s vašimi konkrétními čísly) označuje dramatický nedostatek work_mem
. Postgres shromažďuje adresy bloků pouze při skenování indexu bitmapy namísto ukazatelů řádků, protože se očekává, že to bude rychlejší s vaším nízkým work_mem
nastavení (nemůže mít přesné adresy v paměti RAM). V následujícím Skenování haldy bitmap je třeba filtrovat mnohem více nesplňujících řádků tudy. Tato související odpověď obsahuje podrobnosti:
Ale nenastavujte work_mem
také vysoká bez ohledu na celou situaci:
Mohou se vyskytnout další problémy, jako je nadýmání indexu nebo tabulky nebo další úzká místa v konfiguraci. Pokud však opravíte pouze tyto dvě položky, dotaz by měl být hodně již rychleji.
Také opravdu potřebujete načíst všech 40 000 řádků v příkladu? Pravděpodobně budete chtít přidat malý LIMIT
na dotaz a udělejte z něj vyhledávání „nejbližšího souseda“ – v takovém případě je nakonec index GiST lepší volbou, protože to má být rychlejší s indexem GiST. Příklad: