Kostnadsparametrar för planerare
Detta säger mig att din random_page_cost
och seq_page_cost
är förmodligen fel. Du är troligen på lagring med snabb slumpmässig I/O - antingen för att större delen av databasen är cachad i RAM eller för att du använder SSD, SAN med cache eller annan lagring där slumpmässig I/O är i sig snabb.
Försök:
SET random_page_cost = 1;
SET seq_page_cost = 1.1;
för att avsevärt minska skillnaderna i kostnadsparametrar och sedan köra om. Om det gör jobbet, överväg att ändra dessa parametrar i postgresql.conf.
.
Dina radräkningsuppskattningar är rimliga, så det ser inte ut som ett feluppskattningsproblem eller ett problem med dålig tabellstatistik.
Felaktig fråga
Din fråga är också felaktig. OFFSET 0 LIMIT 1
utan en ORDER BY
kommer att ge oförutsägbara resultat om du inte är garanterad att ha exakt en matchning, i vilket fall OFFSET ... LIMIT ...
klausuler är onödiga och kan tas bort helt.
Du är vanligtvis mycket bättre av att formulera sådana frågor som SELECT max(...)
eller SELECT min(...)
om möjligt; PostgreSQL tenderar att kunna använda ett index för att bara plocka bort det önskade värdet utan att göra en dyr tabellskanning eller en indexskanning och sortering.
Tips
BTW, för framtida frågor har PostgreSQL-wikin lite bra information i prestandakategorin och en guide för att ställa långsamma frågor .