PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Postgresql 9.x:Indice per ottimizzare le query `xpath_exists` (XMLEXISTS)

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 .