Vissa problem sticker ut:
Överväg först att uppgradera till en aktuell version av Postgres . I skrivande stund är det sid 9.6 eller sid 10 (för närvarande beta). Sedan sidan 9.4 har det skett flera förbättringar för GIN-index, tilläggsmodulen pg_trgm och big data i allmänhet.
Därefter behöver du mycket mer RAM , särskilt en högre work_mem
miljö. Jag kan se på den här raden i EXPLAIN
utdata:
Heap Blocks: exact=7625 lossy=223807
"förlustig" i detaljerna för en Bitmap Heap Scan (med dina specifika nummer) indikerar en dramatisk brist på work_mem
. Postgres samlar bara in blockadresser i bitmappsindexsökningen istället för radpekare eftersom det förväntas gå snabbare med din låga work_mem
inställning (kan inte hålla exakta adresser i RAM). Många fler icke-kvalificerande rader måste filtreras i följande Bitmap Heap Scan den här vägen. Det här relaterade svaret har detaljer:
Men ställ inte in work_mem
också hög utan att ta hänsyn till hela situationen:
Det kan finnas andra problem, som index- eller tabelluppsvällning eller fler konfigurationsflaskhalsar. Men om du åtgärdar bara dessa två objekt bör frågan vara mycket redan snabbare.
Dessutom, behöver du verkligen hämta alla 40k rader i exemplet? Du vill förmodligen lägga till en liten LIMIT
till frågan och gör den till en "närmaste granne"-sökning - i så fall är ett GiST-index trots allt det bättre valet, eftersom det antas vara snabbare med ett GiST-index. Exempel: