webForumDet fria alternativet

Lägga villkor i JOIN eller WHERE?

Databaser & SQL

3 svar · 487 visningar · startad av nitro2k01

Medlem sedan aug. 20039 340 inlägg
Frågan#1

Jag har funderat på en sak ett tag, och jag blev påmind av detta inlägg av SPiN i en annan tråd:

SPiN skrev:

select
    a.medlemsnr
from
    a
    inner join
        b
    on
        b.id=a.id
        and
        b.status='aktiv'

Det jag funderar över är, i en fråga med samma struktur som den ovan, finns det någon skillnad i prestanda mellan att lägga villkoret b.status='aktiv' som JOIN-villkor eller WHERE-villkor? Bör man generellt sätt hålla sig till att bara definiera relationsvillkoret i JOIN och lägga allt annat i WHERE? Eller är det så att det som följer ON ... bara klistras ihop internt med WHERE-villkoret mha AND, och att det egentligen inte spelar roll? (prestandamässigt)

Medlem sedan dec. 200012 464 inlägg
#2

Det har ingen prestandabetydelse för en inner join. Det kan ha en semantisk betydelse om du har en outer join.

Medlem sedan sep. 2004828 inlägg
#3

Åh det kan ha en jäkla betydelse.
Jag har flyttat villkor från Where till ON och sänkt tiden att exekvera frågan från 58 sekunder till 0,2 sekunder.

Använd Explain för att ta reda på vilken skillnad det gör för dig
http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/c0005134.htm

Medlem sedan dec. 200012 464 inlägg
#4

Jag uttryckte mig nog väl kategoriskt. Teoretiskt sett så borde det inte ha någon betydelse så länge frågorna ger samma resultat. Om man har en inner join så har det ingen betydelse i vilke ordning vilken villkoren utförs så databashanteraren borde strukturera om frågan så att det blir samma oavsett om villkoren ligger i on eller where.

Skillnaderna i svarstider tyder på att den databashanteraren har en dålig optimerare :)

254 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)