Artiklar » SQL » Alternativ till IN()

 
 

Alternativ till IN()

Författare: minimunk
Datum: den 27 november 2007
Antal lästa: 3103
Ej stjärnmärkt

Ofta ser man sqler som använder sig av IN() på ett eller annat sätt. Tex Kod:
Select Id from tblA where Id IN(Select Id from tblB)



Visst är det smidigt, det många dock inte vet är att IN() är en riktig prestandaätare. Jag tänkte därför visa en alternativ lösning som ger exakt samma resultat och även presentera lite prestandaskillnader.

Istället för IN() kan vi använda oss av en helt vanlig Left Join, och sedan kontrollera ifall en post saknas eftersom vi då får Null-resultat om det inte finns någon relaterad post.

Sqlen som jag visade i början skulle alltså även kunna skrivas såhär för att ge samma resultat. Kod:
Select Distinct tblA.Id From tblA Left Join tblB On tblA.Id = tblB.Id where not tblB.Id is Null



Vi måste förutom att lägga till en Left Join även lägga till en Distinct, eftersom vi bara vill ha ut en post från tblA och inte en post för varje relaterad post som finns i tblB.

Båda Sqlerna kommer alltså att plocka ut posterna från tblA där det finns en relaterad post i tblB. Skillnaden är dock prestandan.

Jag körde de båda frågorna på en mssql 2000 databas via SQL Query Analyzer för att kunna se hur lång tid den behövde för att köra frågorna. Både tabellen A och B hade ungefär 150 000 poster i sig.

Den sqlen som använde sig av IN() tog exakt 2 minut och 19 sekunder att köra. Den sqlen som istället använde sig av en Left Join tog 1 minut och 50 sekunder. Man kan sen lista ut att om man har stora frågor, mer komplexa, med flera IN() så kommer självklart prestandaskillnaden bli ännu större mellan dessa två sqler.
 
     

  » Logga in  
 
Användarnamn

Lösenord

 
     

  » Bli medlem  
  Bli medlem på ASPsidan!  
     

     
  Microsoft  
     

  » Partners  
  Comsolvia  
     
  » ANNONS  
  ingen annons än  
     

  » Senast online  
  Endast för inloggade  
  Antal inloggade: 1  
     

Copyright © 2007 www.ASPsidan.se
ingen sponsrar längre ASPsidan med Dedikerad Server
ASPsidan RSS
   
 XHTML / CSS
Det tog 0,0781 sekunder att ladda sidan