Parameters planner kosten
Dit vertelt me dat uw random_page_cost
en seq_page_cost
zijn waarschijnlijk fout. U bevindt zich waarschijnlijk op opslag met snelle willekeurige I/O - ofwel omdat het grootste deel van de database in het RAM-geheugen is opgeslagen of omdat u SSD, SAN met cache of andere opslag gebruikt waar willekeurige I/O inherent snel is.
Probeer:
SET random_page_cost = 1;
SET seq_page_cost = 1.1;
om de verschillen in kostenparameter aanzienlijk te verminderen en vervolgens opnieuw uit te voeren. Als dat werkt, overweeg dan om die parameters in postgresql.conf.
. te wijzigen .
Uw schattingen van het aantal rijen zijn redelijk, dus het lijkt niet op een probleem met een verkeerde schatting van de planner of een probleem met slechte tabelstatistieken.
Onjuiste zoekopdracht
Ook uw vraag is onjuist. OFFSET 0 LIMIT 1
zonder een ORDER BY
zal onvoorspelbare resultaten opleveren, tenzij u gegarandeerd precies één overeenkomst heeft, in welk geval de OFFSET ... LIMIT ...
clausules zijn overbodig en kunnen volledig worden verwijderd.
Je kunt meestal veel beter vragen formuleren als SELECT max(...)
of SELECT min(...)
waar mogelijk; PostgreSQL is meestal in staat om een index te gebruiken om de gewenste waarde eruit te pikken zonder een dure tabelscan of indexscan en sortering uit te voeren.
Tips
Trouwens, voor toekomstige vragen heeft de PostgreSQL-wiki goede informatie in de prestatiecategorie en een handleiding voor het stellen van Langzame query-vragen .