Hvilket er hurtigere – sammenføjninger eller underforespørgsler?


Bedste svar

Mens både sammenføjninger og underforespørgsler har deres plads i SQL-sætninger, prøver jeg personligt altid at skrive mine forespørgsler ved hjælp af sammenføjninger udelukkende . I mellemtiden introducerer jeg kun en underforespørgsel, når jeg ikke kan hente de data, jeg ønsker uden en.

Årsagen er, at sammenføjninger har en tendens til at udføre hurtigere. Faktisk vil jeg gå så langt som at sige, at forespørgslens hentningstid ved hjælp af sammenføjninger næsten altid vil være hurtigere end for en underforespørgsel.

Årsagen er, at sammenføjninger lindrer beregningsbyrden på database ved at erstatte flere forespørgsler med en sammenføjningsforespørgsel. Dette gør igen bedre brug af databasens evner til at søge igennem, filtrere og sortere poster.

Selvfølgelig, når du tilføjer flere sammenføjninger til en forespørgsel, skal databaseserveren gøre mere arbejde, hvilket oversættes til langsommere datahentningstider.

Selvom sammenføjninger er nødvendige for at hente data fra en normaliseret database, er det vigtigt, at sammenføjninger skrives korrekt, da forkerte sammenføjninger kan resultere i alvorlig ydelsesforringelse og unøjagtige forespørgselsresultater.

I nogle tilfælde kan underforespørgsler erstatte komplekse sammenføjninger og fagforeninger med kun en minimal negativ effekt på ydeevnen.

Eksempler på underforespørgsler

Nogle gange kan du ikke rigtig komme rundt ved hjælp af en underforespørgsel. Her er et par eksempler, der bruger Sakila-eksempeldatabase til MySQL og min Navicat databaseudvikling og admin-klient.

Eksempel # 1: Brug af en samlet funktion som en del af en JOIN-klausul

Det meste af tiden er tabeller samlet i et fælles felt. Faktisk er det ikke usædvanligt, at det fælles felt også deler det samme navn for at vise, at det er de samme data. I den følgende forespørgsel er kundetabellen imidlertid knyttet til den seneste (MAX) create\_date, så forespørgselsresultaterne er for den kunde, der sidst tilmeldte sig.

En underforespørgsel anvendes, fordi du ikke kan bruge samlede funktioner som en del af en WHERE-klausul. Denne geniale løsning omgår denne begrænsning!

Eksempel # 2:

I denne forespørgsel anvendes en underforespørgsel til at hente et mellemliggende resultatsæt, så vi kan anvende AVG () -funktionen på ANTALET af lejede film. Dette er hvad jeg kalder en dobbeltaggregering, fordi vi anvender en aggregering (AVG) på resultatet af en anden (COUNT).

Denne særlige forespørgsel er ret hurtig – tager kun 0,044 sekunder – fordi den indre forespørgsel vender tilbage en enkelt værdi. Normalt er de langsomste forespørgsler dem, der kræver fuldstændige tabel-scanninger.

Håber det besvarer dit spørgsmål.

Hilsen!

Adam

Svar

Normalt skal du skrive forespørgsler for at være så klare som muligt og overlade optimeringen til RDBMS forespørgselsprocessor og DBA, hvis du har en, der er ansvarlig for at indstille det fysiske design. Dette burde resultere i god nok ydeevne i de fleste tilfælde, men der er undtagelser. Nogle gange har en RDBMS forespørgselsoptimering blinde pletter eller dårlige tilfælde.

Nu hvis enten sammenføjninger eller underforespørgsler vil være et problem for en optimizer, er det meget mere sandsynligt, at det er i underforespørgsler. Det skyldes, at sammenføjning er et grundlæggende træk ved det sprog, som alle brugere bruger, mens mange brugere slet ikke bruger underforespørgsler. Jeg fandt ud af, at konvertering af en app fra Sybase til SQL Server måtte jeg omskrive mange underforespørgsler som sammenføjninger på grund af fejl i Microsofts håndtering af underforespørgsler – omend i et meget specifikt tilfælde (hvor underforespørgslen, hvor klausulen indeholdt en bundet parameter). Det er ikke overraskende, at SQL Server havde bugs i underforespørgsler, fordi så mange af dets kunder bruger SQL Server med Microsofts grafiske forespørgselseditorer, der naturligt producerer sammenføjninger, men ikke underforespørgsler.

Jeg fraråder typisk mod for tidlig optimering, men jeg vil foretage en undtagelse her. Hvis din applikation skal være bærbar på tværs af flere databaseplatforme, foretrækker jeg sammenføjninger til underforespørgsler i de fleste tilfælde, fordi det er mere sandsynligt, at du løber ind i fejl eller dårlige optimeringsvalg med underforespørgsler. applikationen behøver ikke at være bærbar, skriv forespørgslen på, hvad der synes den mest naturlige måde, og hvis der ikke er noget problem – hvilket vil være det meste af tiden – fint. Hvis der er et problem, skal du omskrive forespørgslen forskelligt for at se, om det hjælper. Og hvis du har en DBA, skal du kontakte ham om eventuelle ydeevneproblemer.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *