Avatar billede stigc Nybegynder
25. januar 2003 - 14:25 Der er 4 kommentarer og
3 løsninger

Hastighed på sub select vc. joins

Man kan ofte lave JOINS istedet for Sub selects. Men er der en forskel på hastigheden?

Her er et eksempel på en mySql database. Spørgsmålet går dog på stadigvæk på MSSql

http://www.mysql.com/doc/en/ANSI_diff_Sub-selects.html
Avatar billede websmith Nybegynder
25. januar 2003 - 14:48 #1
Jeg ved hvis man bruges Query Analyser i Ms SQL og slår execution plan til, så kan man se at når man laver joins, så laver den selv sub selects.

Men om det er hurtigere det ene eller andet, det må vist komme an på en prøve. Jeg tror umiddelbart at joins er hurtigere hvis man har en condition med, dvs.

select * from xxx LEFT join yyy on xx.id=yyy.id where xxx.sss=3

Så tror jeg ganske sikkert at en join er hurtigere, for på den måde så henter den først alle records fra xxx hvor sss=3, og det gør den via indexet. Herefter gør den det samme med yyy, men bare på id kolonnen.

Hvis man havde lavet den samme med en sub select, så ville det jo være således:

select * from xxx where id in (select id from yyy) and xxx.sss=3. Det jo helt sikkert mere langsomt, da den først skal hente alle ids fra yyy, og så matche dem op imod dem fra xxx hvor sss=3.

Jeg håber det var forklaret godt nok. :)
Avatar billede janus_007 Nybegynder
25. januar 2003 - 14:49 #2
Hej!
Det er lidt svært at sige sådan, men som regel er der ingen forskel. Hvis du har en query-analyzer, kan du jo markere begge statements, altså subselecten og join. Slå execution-plan til (CTRL-k), eller vælg den under menu/ query, der kan du så se hvad de hver især koster eks. "relative to batch" osv....
Avatar billede websmith Nybegynder
25. januar 2003 - 14:49 #3
Generelt så er sub selects jo bare den nemme måde at gøre tingene på, og joins den besværlige måde fordi man skal huske på syntaxen :)
Avatar billede janus_007 Nybegynder
25. januar 2003 - 16:20 #4
hmmm næh det er jeg ikke helt enig med dig i! . Det gælder vist kun ved inner joins :O)
Hvad med outer joins, cross joins, left joins, right joins ???
Avatar billede arne_v Ekspert
26. januar 2003 - 00:28 #5
Prøv det.

Jeg vil tro at for de fleste databaser vil join være hurtigere
end sub select.

Men stol ikke på mig, lav en lille test og mål det selv !
Avatar billede Broholm Novice
29. januar 2003 - 21:26 #6
Til websmith: Jeg tror at Query Optimizeren (forhåbenlig :-) er klog nok til at se at

select * from xxx where id in (select id from yyy) and xxx.sss=3

er det samme som:

select * from xxx where xxx.sss=3 and id in (select id from yyy)

og derved stadig filtrere xxx.sss=3 på index først.
Avatar billede stigc Nybegynder
31. januar 2003 - 13:26 #7
Er der ikke nogne der laver en test? :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester