aic007 Skrevet 28. mai 2006 Skrevet 28. mai 2006 Hei! Er følgende koder helt like ? Og spiller det noen rolle om man velger å bruke alternativ 2 ? (Alternativ 1 er som det står i boka, men jeg synes at alternativ 2 er mye enklere, men vet ikke om alternativ 2 blir riktig). Alternativ 1 SELECT navn FROM FORELESER WHERE fnr IN (SELECT fnr FROM KURSSEM WHERE knr IN (SELECT knr FROM KURS WHERE tittel = "Relasjonsdatabaser")); Alternativ 2 SELECT F.Navn FROM FORELESER AS F, KURSSEM AS KS, KURS AS K WHERE F.fnr = KS.fnr AND K.knr = KS.knr AND K.titel = "Relasjonsdatabaser";
roac Skrevet 28. mai 2006 Skrevet 28. mai 2006 Hei!Er følgende koder helt like ? Og spiller det noen rolle om man velger å bruke alternativ 2 ? (Alternativ 1 er som det står i boka, men jeg synes at alternativ 2 er mye enklere, men vet ikke om alternativ 2 blir riktig). Alternativ 1 SELECT navn FROM FORELESER WHERE fnr IN (SELECT fnr FROM KURSSEM WHERE knr IN (SELECT knr FROM KURS WHERE tittel = "Relasjonsdatabaser")); Alternativ 2 SELECT F.Navn FROM FORELESER AS F, KURSSEM AS KS, KURS AS K WHERE F.fnr = KS.fnr AND K.knr = KS.knr AND K.titel = "Relasjonsdatabaser"; 6194692[/snapback] Alternativ 2 er MYE bedre kode. Det første alternativet vil jeg fraråde på det sterkeste, da det er er to faktorer som har en egen evne til å trekke ned ytelse, den ene er bruk av IN, det andre er bruk av subqueries. Dersom du hadde endret alternativ 2 til å bruke inner join i steden ville jeg si at du var i boks med en god spørring. Det skulle bli noe slikt som: SELECT F.Navn FROM FORELESER AS F INNER JOIN KURSSEM AS KS ON (F.fnr = KS.fnr) INNER JOIN KURS AS K ON (K.knr = KS.knr) WHERE K.titel = "Relasjonsdatabaser"; Normalt sett bør det ikke være noen forskjell på dette og alternativ 2, men i praksis vil databaseserveren i en del tilfeller utføre spørringer med inner join mer effektivt.
Ueland Skrevet 28. mai 2006 Skrevet 28. mai 2006 I følge MySQL selv så er WHERE foo in(list of constants) "very optimized", så spørs om det er så galt, erfaringsmessig er hvertfall IN kjapp å grei å bruke. http://dev.mysql.com/tech-resources/presen...0719/index.html
roac Skrevet 28. mai 2006 Skrevet 28. mai 2006 I følge MySQL selv så er WHERE foo in(list of constants) "very optimized", så spørs om det er så galt, erfaringsmessig er hvertfall IN kjapp å grei å bruke. http://dev.mysql.com/tech-resources/presen...0719/index.html 6196594[/snapback] Hmm, snedig at den er veldig optimalisert i MySQL. Ellers er det heller et problem at den ikke er effektiv, siden expr1 in (expr2) vil føre til at hele expr2 utføres før expr1, dette i motsetning til et tilsvarende join, hvor expr1 og expr2 kan gå samtidig. Men for all del, det er nyttig å få litt mer informasjon om MySQL.
Ueland Skrevet 29. mai 2006 Skrevet 29. mai 2006 Hvordan det er med å kjøre spørring i spørring vet jeg ikke men jeg vil tro at det ikke er det mest optimale, ikke minst så er det jo greit med litt oversiktelighet og i SQL koden.
Manfred Skrevet 29. mai 2006 Skrevet 29. mai 2006 Uansett er joins av flere tabeller uten JOIN veldig gammel MySQL-syntax. Av den grunn vil jeg si at alternativ 2 er utrolig stygg, men fortsatt ikke så stygg som alternativ 1, med to sub-queries der du bare kan JOINE. Den er nesten mer fy-fy. Konklusjon: du har kommet opp med to stygge løsninger. Prøv igjen
blackbrrd Skrevet 1. juni 2006 Skrevet 1. juni 2006 Av og til skjønner ikke databasen hvordan den skal kjøre spørringen for å gjøre så lite som mulig arbeid. Hadde en spørring som ved bruke av vanlige inner joins brukte ca 700ms og ved hjelp av en inner joins + in i where clausen brukte ca 50ms. (Som nevnt, IN biten ble kjørt først og det var bra for det var den som begrenset spørringen til de korrekte dataene på en hurtigst mulig måte) Mitt råd er å alltid bruke INNER JOIN hvor det er mulig og gir god ytelse. Først når det slår feil er det noe poeng i å prøve seg med IN... INNER JOIN gjør stort sett spørringene ryddige og enkle å lese.
j000rn Skrevet 1. juni 2006 Skrevet 1. juni 2006 MySQL siden sa: * Joins are normally faster than subselects (this is true for most SQL servers). * foo IN (list of constants) is very optimized. Legg merke til "list of constants". Uansett så vil join være bedre. SQL Server (og sikkert MySQL) vil avhengig av statistikk i noen tilfeller faktisk utføre JOIN'en som en subselect. Uansett; skriv ordentlig JOIN og la SQL serveren velge best måte å gjøre dette på "under panseret". Om du er nysgjerrig kan du bruke Query Analyzer på SQL Server for å se hva den faktisk bruker ved å se igjennom Execution Plan'en.
ofredstie Skrevet 5. juni 2006 Skrevet 5. juni 2006 (endret) Det vil ikke være noen nevneverdig forskjell mellom en "INNER JOIN spørring" og alternativ 2 spørringen din fordi en INNER JOIN utfører eksakt den samme kalkulasjonen for begge spørringene. Dermed trenger du ikke bruke INNER JOINs men de gjør at det blir mye enklere å lese/forstå sql-koden. SELECT f.navn FROM foreleser AS f, kurssem AS ks, kurs AS k WHERE f.fnr = ks.fnr AND k.knr = ks.knr AND k.titel = "Relasjonsdatabaser"; SELECT f.navn FROM foreleser f INNER JOIN kurssem ks USING (fnr) INNER JOIN kurs k USING (knr) WHERE k.titel = "Relasjonsdatabaser"; Endret 5. juni 2006 av ofredstie
roac Skrevet 5. juni 2006 Skrevet 5. juni 2006 Vær forøvrig klar over at selv om USING er en del av SQL standarden (kom vel i SQL-92 eller SQL-99 tror jeg), så er det en god del databaser som ikke støtter dette. Jeg mener bestemt at Sybase ESE, Microsoft SQL Server og IBM DB2 er blant disse, og for alt det jeg vet kan det være flere også. Jeg synes i hvert fall det er kjekt å ha slikt i bakhodet, i tilfelle jeg skulle finne på å porte koden til en annen databaseplattform senere.
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå