Beste antwoord
Hoewel zowel joins als subquerys hun plaats hebben in SQL-instructies, probeer ik persoonlijk altijd mijn queries te schrijven met uitsluitend joins . Ondertussen introduceer ik alleen een subquery als ik de gewenste gegevens niet zonder kan ophalen.
De reden is dat joins de neiging hebben om sneller uit te voeren. In feite zou ik zelfs zo ver willen gaan om te zeggen dat de ophaaltijd van de query met joins bijna altijd sneller zal zijn dan die van een subquery.
De reden is dat joins de rekenlast op de database door meerdere querys te vervangen door één join-query. Dit maakt op zijn beurt beter gebruik van de mogelijkheden van de database om records te doorzoeken, te filteren en te sorteren.
Natuurlijk, naarmate u meer joins aan een query toevoegt, moet de databaseserver meer werk doen, wat zich vertaalt om het ophalen van gegevens te vertragen.
Hoewel joins nodig zijn om gegevens uit een genormaliseerde database op te halen, is het belangrijk dat joins correct worden geschreven, omdat onjuiste joins kunnen leiden tot ernstige prestatieverlies en onnauwkeurige queryresultaten.
In sommige gevallen kunnen subquerys complexe joins en unions vervangen met slechts een minimaal negatief effect op de prestaties.
Voorbeelden van subquerys
Soms kun je er niet echt omheen met een subquery. Hier zijn een paar voorbeelden van het gebruik van de Sakila Sample Database voor MySQL en mijn Navicat database-ontwikkeling en admin-client.
Voorbeeld 1: een aggregatiefunctie gebruiken als onderdeel van een JOIN-clausule
Meestal worden tabellen samengevoegd op een gemeenschappelijk veld. In feite is het niet ongebruikelijk dat het gemeenschappelijke veld ook dezelfde naam heeft om aan te tonen dat het dezelfde gegevens zijn. In de volgende query wordt de klantentabel echter samengevoegd met de laatste (MAX) create\_date, zodat de queryresultaten voor de klant zijn die zich het laatst heeft aangemeld.
Er wordt een subquery gebruikt omdat u geen statistische functies kunt gebruiken als onderdeel van een WHERE-clausule. Deze ingenieuze oplossing omzeilt die beperking!
Voorbeeld 2:
In deze query wordt een subquery gebruikt om een tussenliggende resultatenset op te halen, zodat we de functie AVG () kunnen toepassen op het AANTAL gehuurde films. Dit is wat ik een dubbele aggregatie noem, omdat we een aggregatie (AVG) toepassen op het resultaat van een andere (COUNT).
Deze specifieke query is vrij snel – duurt slechts 0,044 seconden – omdat de innerlijke query terugkeert een enkele waarde. Gewoonlijk zijn de langzaamste zoekopdrachten degene die volledige tabelscans vereisen.
Ik hoop dat uw vraag hiermee wordt beantwoord.
Met vriendelijke groet!
Adam
Antwoord
Gewoonlijk moet u queries schrijven om zo duidelijk mogelijk te zijn en het optimaliseren overlaten aan de queryprocessor van de RDBMS en de DBA, als u die heeft, die verantwoordelijk is voor het afstemmen van het fysieke ontwerp. zou in de meeste gevallen moeten resulteren in prestaties die goed genoeg zijn, maar er zijn uitzonderingen. Soms heeft de query-optimalisator van een RDBMS blinde vlekken of slechte gevallen.
Als joins of subquerys een probleem gaan vormen voor een optimizer, is de kans veel groter dat het in subquerys voorkomt. Dat komt omdat join een basisfunctie is van de taal die alle gebruikers gebruiken, terwijl veel gebruikers helemaal geen subquerys gebruiken. Ik ontdekte dat het converteren van een app van Sybase naar SQL Server Ik moest veel subquerys herschrijven als joins vanwege bugs in Microsofts afhandeling van subquerys – zij het in een zeer specifiek geval (waar de subquery where clausule een gebonden parameter bevatte). Het is niet verwonderlijk dat SQL Server bugs in subquerys had, omdat zoveel van zijn klanten SQL Server gebruiken met de grafische query-editors van Microsoft die van nature joins produceren, maar geen subquerys.
Ik raad meestal af om voortijdige optimalisatie, maar ik maak hier een uitzondering. Als uw toepassing over meerdere databaseplatforms heen moet kunnen worden gebruikt, geef ik in de meeste gevallen de voorkeur aan joins boven subquerys, omdat de kans groter is dat u bugs of slechte optimalisatiekeuzes tegenkomt bij subquerys. applicatie hoeft niet draagbaar te zijn, schrijf de query op wat de meest natuurlijke manier lijkt en als er geen probleem is – wat meestal zal zijn – prima. Als er een probleem is, herschrijf de query dan anders om te zien of dat helpt. En als je een DBA hebt, raadpleeg hem dan over eventuele prestatieproblemen die je hebt.