Paras vastaus
Vaikka sekä liittymisillä että alakyselyillä on paikkansa SQL-lauseissa, yritän henkilökohtaisesti kirjoittaa kyselyni yksinomaan liittymillä . Sillä välin esitän alakyselyn vain silloin, kun en voi hakea haluamiasi tietoja ilman sitä.
Syynä on, että liittymiset suorittavat yleensä nopeammin. Itse asiassa menen niin pitkälle, että sanoin, että kyselyjen haku aika liittymien avulla on melkein aina nopeampaa kuin alikyselyn.
Syynä on, että liittymiset helpottavat laskentataakkaa tietokanta korvaamalla useita kyselyitä yhdellä kyselyllä. Tämä puolestaan hyödyntää paremmin tietokannan kykyä etsiä, suodattaa ja lajitella tietueita.
Tietysti, kun lisäät kyselyyn uusia liittymiä, tietokantapalvelimen on tehtävä enemmän työtä, mikä kääntää hitaampaan tiedonhakuaikaan.
Vaikka liitännät ovat välttämättömiä tietojen noutamiseksi normalisoidusta tietokannasta, on tärkeää, että liitokset kirjoitetaan oikein, koska virheelliset liittymät voivat johtaa vakavaan suorituskyvyn heikkenemiseen ja epätarkkoihin kyselytuloksiin.
Joissakin tapauksissa alakyselyt voivat korvata monimutkaiset liitokset vain vähän negatiivisella vaikutuksella suorituskykyyn.
Esimerkkejä alakyselyistä
Joskus et voi kiertää alikyselyä käyttämällä. Tässä on muutama esimerkki Sakila-näytetietokannan käyttämisestä MySQL: lle ja Navicat -tietokannan kehittämisen ja järjestelmänvalvojan asiakkaalle.
Esimerkki # 1: Kokoomatoiminnon käyttäminen osana JOIN-lausetta
Useimmiten taulukot yhdistetään yhteiselle kentälle. Itse asiassa ei ole epätavallista, että yhteinen kenttä jakaa myös saman nimen osoittaakseen, että se on sama data. Seuraavassa kyselyssä asiakastaulukko on kuitenkin yhdistetty viimeisimpään (MAX) create\_date -päiväkirjaan siten, että kyselytulokset koskevat viimeksi kirjautunutta asiakasta.
Alakyselyä käytetään, koska et voi käyttää koontitoimintoja. osana WHERE-lauseketta. Tämä nerokas kiertotapa kiertää rajoituksen!
Esimerkki # 2:
Tässä kyselyssä alikyselyä käytetään välitulosjoukon hakemiseen, jotta voimme soveltaa AVG () -toimintoa vuokrattujen elokuvien COUNT: een. Tätä kutsun kaksoisaggregaatiksi, koska sovellamme aggregaatiota (AVG) toisen (COUNT) tulokseen.
Tämä tietty kysely on melko nopea – kestää vain 0,044 sekuntia – koska sisäinen kysely palaa yksi arvo. Yleensä hitaimmat kyselyt edellyttävät koko taulukon tarkistusta.
Toivottavasti vastaat kysymykseesi.
Terveisin!
Adam
Vastaa
Yleensä sinun tulee kirjoittaa kyselyt mahdollisimman selkeiksi ja jättää optimointi RDBMS: n kyselyprosessorille ja DBA: lle, jos sinulla on sellainen, joka vastaa fyysisen suunnittelun virittämisestä. pitäisi johtaa riittävän hyvään suorituskykyyn useimmissa tapauksissa, mutta on myös poikkeuksia. Joskus RDBMS: n kyselynoptimointityökalussa on sokeita pisteitä tai huonoja tapauksia.
Jos joko liittymiset tai alakyselyt tulevat olemaan ongelma optimoija, se on todennäköisemmin alikyselyissä. Tämä johtuu siitä, että liittyminen on kielen perusominaisuus, jota kaikki käyttäjät käyttävät, kun taas monet käyttäjät eivät käytä lainkaan alakyselyjä. Löysin, että sovelluksen muuntaminen Sybasesta SQL Serveriin jouduin kirjoittamaan uudet alikyselyt uudelleen liittyminä Microsoftin virheiden takia alakyselyjen käsittely – vaikkakin hyvin erityisessä tapauksessa (jos alakysely, jossa lauseke sisälsi sidotun parametrin). Ei ole yllättävää, että SQL Serverillä oli virheitä alakyselyissä, koska niin monet sen asiakkaista käyttävät SQL Serveriä Microsoftin graafisten kyselyeditorien kanssa, jotka luonnollisesti tuottavat liittymiä, mutta eivät alikyselyjä.
Suosittelen yleensä ennenaikaista optimointia, mutta teen tässä poikkeuksen. Jos sovelluksesi on oltava kannettava useilla tietokantaympäristöillä, mieluummin liittyisin alikyselyihin useimmissa tapauksissa, koska todennäköisemmin törmäät virheisiin tai huonoihin optimoijavalintoihin alakyselyjen kanssa. Jos sovelluksen ei tarvitse olla kannettava, kirjoita kysely luonnollisimmalla tavalla ja jos siinä ei ole ongelmaa – joka tulee suurimmaksi osaksi – hyvin. Jos on ongelma, kirjoita kysely uudelleen eri tavalla nähdäksesi, auttaako se. Ja jos sinulla on DBA, ota yhteyttä häneen mahdollisista suorituskykyongelmista.