webForumDet fria alternativet

Märklig form av join - vad händer egentligen här?

Databaser & SQL

1 svar · 1 079 visningar · startad av aasah

Medlem sedan mars 20034 471 inlägg
Frågan#1

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?

Medlem sedan dec. 200012 464 inlägg
#2

Det blir olika optimering, jämför resultatet av explain för båda frågorna.

269 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)