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

Differenza di prestazioni:condizione posta alla clausola INNER JOIN vs WHERE

Il motivo per cui stai vedendo una differenza è dovuto al piano di esecuzione che il pianificatore sta mettendo insieme, questo è ovviamente diverso a seconda della query (probabilmente, dovrebbe essere l'ottimizzazione delle 2 query in modo che siano le stesse e questo potrebbe essere un bug ). Ciò significa che il pianificatore pensa di dover lavorare in un modo particolare per arrivare al risultato in ogni affermazione.

Quando lo fai all'interno di JOIN, il pianificatore dovrà probabilmente selezionare dalla tabella, filtrare per la parte "True", quindi unire i set di risultati. Immagino che si tratti di una tabella di grandi dimensioni, e quindi di molti dati da esaminare, e non può utilizzare gli indici in modo efficiente.

Sospetto che se lo fai in una clausola WHERE, il pianificatore sta scegliendo un percorso più efficiente (ad esempio, set di dati basato su indici o prefiltrato).

Probabilmente potresti far funzionare il join più velocemente (se non più veloce) aggiungendo un indice sulle due colonne (non sono sicuro che le colonne incluse e gli indici di più colonne siano ancora supportati su Postgres).

In breve, il problema del pianificatore è scegliere 2 percorsi diversi per arrivare ai set di risultati, e uno di questi non è efficiente come l'altro. È impossibile per noi sapere quali sono i motivi senza le informazioni complete sulla tabella e le informazioni EXPLAIN ANALYZE.

Se desideri informazioni specifiche sul motivo per cui la tua query specifica sta facendo questo, dovrai fornire ulteriori informazioni. Tuttavia, il motivo è che il pianificatore sceglie percorsi diversi.

Materiale di lettura aggiuntivo:

http://www.postgresql.org/docs/current/static/explicit-joins.html

Appena scremato, sembra che il pianificatore postgres non riordini i join per ottimizzarlo. prova a cambiare l'ordine dei join nella tua dichiarazione per vedere se poi ottieni la stessa performance... solo un pensiero.