Det blir olika optimering, jämför resultatet av explain för båda frågorna.
I normala fall knyter man ihop varje ny tabell som införs i en join med redan införda tabeller som står ovanför i FROM-klausulen. Nu har jag i befintlig kod hittat ett uttryck som jag undrar hur, närmare bestämt, MS SQL servern (2000) egentligen tolkar innehållet.
Frågan hämtar information om vilka användare som har rätt att se vilka saker (s.k. AccessPoints, vilkas rättigheter sätts på användargruppsnivå) samt lite annat smått och gott.
SELECT *
FROM
User U
INNER JOIN UserGroup UG ON U.UserID = UG.UserID
INNER JOIN UserGroupAccessPoint UGAP --!! No "ON" ?!
INNER JOIN Group G ON UGAP.GroupID = G.GroupID
INNER JOIN AccessPoint AP ON UGAP.AccessPointID = AP.AccessPoint
ON --!! Here comes the missing "ON"...
UG.GroupID = G.GroupID
INNER JOIN AnotherTable T ON UGAP.AccessPointID = T.AccessPointID
Koden fungerar så till vida att den hämtar ut rätt saker, men det tar närmare 9 sekunder (!!) mot 0 om frågan skrivs om på vanligt sätt.
Är det möjligen så att det i själva verket blir en CROSS JOIN mellan UG och UGAP här eftersom det saknas villkor dem emellan? Eller vad händer?