Grunden til, at du ser en forskel, skyldes den udførelsesplan, som planlæggeren sammensætter, denne er åbenlyst forskellig afhængig af forespørgslen (velsagtens burde det være at optimere de 2 forespørgsler til at være ens, og dette kan være en fejl ). Det betyder, at planlæggeren mener, at det skal arbejde på en bestemt måde for at nå frem til resultatet i hvert udsagn.
Når du gør det inden for JOIN, skal planlæggeren sandsynligvis vælge fra tabellen, filtrere efter "True"-delen og derefter slutte sig til resultatsættene. Jeg kunne forestille mig, at dette er en stor tabel, og derfor en masse data at se igennem, og den kan ikke bruge indekserne så effektivt.
Jeg formoder, at hvis du gør det i en WHERE-klausul, vælger planlæggeren en rute, der er mere effektiv (dvs. enten indeksbaseret eller forudfiltreret datasæt).
Du kunne sandsynligvis få sammenføjningen til at fungere lige så hurtigt (hvis ikke hurtigere) ved at tilføje et indeks på de to kolonner (ikke sikker på, om inkluderede kolonner og flere kolonneindekser er understøttet på Postgres endnu).
Kort sagt er planlæggeren problemet, det er at vælge 2 forskellige ruter for at komme til resultatsættene, og den ene af dem er ikke så effektiv som den anden. Det er umuligt for os at vide, hvad årsagerne er uden den fulde tabelinformation og FORKLAR ANALYSE-oplysningerne.
Hvis du vil have nærmere oplysninger om, hvorfor din specifikke forespørgsel gør dette, skal du give flere oplysninger. Men grunden er, at planlæggeren vælger forskellige ruter.
Yderligere læsestof:
http://www.postgresql.org/docs/current/static/explicit-joins.html
Lige skimmet, ser det ud til, at postgres-planlæggeren ikke genbestiller joinforbindelser for at optimere den. prøv at ændre rækkefølgen af joinforbindelserne i din erklæring for at se, om du så får den samme præstation... bare en tanke.