Remus schreef op zaterdag 17 december 2011 @ 17:23:
[...]
Eigenlijk is dit enkel de syntax voor het carthesisch product van alle tables met daarna in de WHERE je filter voorwaarden. De query optimizer verandert het echter in bijvoorbeeld een INNER JOIN, omdat dat vele male efficienter is dan eerst een carthesisch product opbouwen en daarna het grootste deel weer weg te gooien.
Dat is niet meer dan een aanname en geldt in elk geval niet voor PostgreSQL: PostgreSQL zal intern een INNER JOIN herschrijven naar een WHERE en vervolgens voor ieder onderdeel van de query het meest ideale queryplan gaan berekenen. De functie eqjoinsel() is verantwoordelijk voor de "join" en daar is er maar één van.
Meer informatie hierover kun je vinden in de handleiding:
Het voordeel van de expliciete join syntax is dat het duidelijker is hoe je je query opbouwt, het is makkelijker om te switchen tussen join type en je voorwaarden in de WHERE zijn beperkt tot de filterende voorwaarden (iaw: een duidelijker scheiding tussen de diverse taken).
+1
Hoewel filterende voorwaarden ook in de JOIN conditie kunnen worden opgenomen, en het in sommige gevallen zelfs noodzakelijk is om een correct resultaat retour te krijgen. Al speelt dat laatste niet bij INNER JOIN's.
SQL is een taal om met de database te communiceren, niet een taal om de database te vertellen hoe iets moet worden opgezocht. Dat laatste mag de database zelf uitzoeken, de database heeft veel meer informatie over de data dan dat ik dat kan hebben. Mits goed ingericht en onderhouden...
Ps. EXPLAIN laat in PostgreSQL ook zien hoe een query wordt herschreven, met die informatie kun je jouw eigen brouwsel van complexe queries vaak ook al een heel stuk verbeteren in de leesbaarheid.