Parametri di costo del pianificatore
Questo mi dice che il tuo random_page_cost
e seq_page_cost
probabilmente hanno torto. È probabile che utilizzi uno spazio di archiviazione con I/O casuale veloce, sia perché la maggior parte del database è memorizzata nella cache nella RAM o perché stai utilizzando SSD, SAN con cache o altro spazio di archiviazione in cui l'I/O casuale è intrinsecamente veloce.
Prova:
SET random_page_cost = 1;
SET seq_page_cost = 1.1;
per ridurre notevolmente le differenze di parametro di costo e quindi rieseguire. Se questo fa il lavoro, considera di cambiare quei parametri in postgresql.conf.
.
Le tue stime del conteggio delle righe sono ragionevoli, quindi non sembra un problema di stima errata del pianificatore o un problema con statistiche di tabella errate.
Richiesta errata
Anche la tua domanda non è corretta. OFFSET 0 LIMIT 1
senza un ORDER BY
produrrà risultati imprevedibili a meno che tu non abbia la garanzia di avere esattamente una corrispondenza, nel qual caso OFFSET ... LIMIT ...
le clausole non sono necessarie e possono essere rimosse del tutto.
Di solito è molto meglio formulare query come SELECT max(...)
o SELECT min(...)
dove possibile; PostgreSQL tenderà a essere in grado di utilizzare un indice per estrarre il valore desiderato senza eseguire una costosa scansione della tabella o una scansione dell'indice e l'ordinamento.
Suggerimenti
A proposito, per domande future il wiki di PostgreSQL ha alcune buone informazioni nella categoria delle prestazioni e una guida per porre domande di query lente .