Důvod, proč vidíte rozdíl, je kvůli prováděcímu plánu, který plánovač sestavuje, to se samozřejmě liší v závislosti na dotazu (pravděpodobně by to mělo být optimalizace 2 dotazů, aby byly stejné, a to může být chyba ). To znamená, že plánovač si myslí, že musí pracovat určitým způsobem, aby se dostal k výsledku v každém prohlášení.
Když to uděláte v rámci JOIN, plánovač bude pravděpodobně muset vybrat z tabulky, filtrovat podle části "True" a poté spojit sady výsledků. Představoval bych si, že se jedná o velkou tabulku, a tedy spoustu dat, která je třeba prohlížet, a nemůže tak efektivně využívat indexy.
Mám podezření, že pokud to uděláte v klauzuli WHERE, plánovač zvolí cestu, která je efektivnější (tj. buď na základě indexu, nebo předfiltrovaná datová sada).
Pravděpodobně byste mohli zajistit, aby spojení fungovalo stejně rychle (ne-li rychleji) přidáním indexu do dvou sloupců (nejste si jisti, zda zahrnuté sloupce a indexy více sloupců jsou na Postgresu zatím podporovány).
Stručně řečeno, plánovač je problém, který vybírá 2 různé cesty, jak se dostat k sadám výsledků, a jedna z nich není tak efektivní jako druhá. Je nemožné, abychom věděli, jaké jsou důvody bez informací o úplné tabulce a informací EXPLAIN ANALYZE.
Pokud chcete upřesnit, proč to váš konkrétní dotaz dělá, budete muset poskytnout další informace. Důvodem je však to, že plánovač volí různé trasy.
Další materiály ke čtení:
http://www.postgresql.org/docs/current/static/explicit-joins.html
Jen letmo, zdá se, že plánovač postgres nepřeřizuje spojení, aby to optimalizoval. zkuste změnit pořadí spojení ve svém prohlášení, abyste viděli, zda pak dosáhnete stejného výkonu... jen myšlenka.