Cel mai bun răspuns
În timp ce ambele asocieri și subinterogări își au locul în instrucțiunile SQL, eu personal încerc mereu să îmi scriu interogările folosind uniri exclusiv . Între timp, introduc o subinterogare numai atunci când nu pot prelua datele pe care le vreau fără una.
Motivul este că îmbinările tind să se execute mai repede. De fapt, aș merge atât de departe încât să spun că timpul de recuperare a interogării folosind îmbinări va fi aproape întotdeauna mai rapid decât cel al unei subinterogări.
Motivul este că îmbinările ameliorează sarcina de calcul asupra baza de date prin înlocuirea mai multor interogări cu o interogare de unire. La rândul său, acest lucru folosește mai bine abilitățile bazei de date pentru a căuta, filtra și sorta înregistrările.
Desigur, pe măsură ce adăugați mai multe îmbinări la o interogare, serverul bazei de date trebuie să facă mai multă muncă, ceea ce se traduce pentru a încetini timpul de recuperare a datelor.
În timp ce îmbinările sunt necesare pentru a prelua date dintr-o bază de date normalizată, este important ca îmbinările să fie scrise corect, deoarece îmbinările incorecte pot duce la degradarea gravă a performanței și la rezultate de interogare inexacte.
În unele cazuri, subinterogările pot înlocui îmbinările și unirile complexe cu un efect negativ minim asupra performanței.
Exemple de subinterogări
Uneori nu vă puteți descurca cu adevărat folosind o subinterogare. Iată câteva exemple care utilizează baza de date Sakila Sample pentru MySQL și Navicat dezvoltarea bazei de date și clientul de administrare.
Exemplul # 1: Utilizarea unei funcții agregate ca parte a unei clauze JOIN
De cele mai multe ori, tabelele sunt unite pe un câmp comun. De fapt, nu este neobișnuit ca câmpul comun să împărtășească același nume și pentru a arăta că sunt aceleași date. Cu toate acestea, în următoarea interogare, tabelul pentru clienți este alăturat celei mai recente (MAX) create\_date, astfel încât rezultatele interogării să fie pentru clientul care s-a înscris cel mai recent.
Se utilizează o subinterogare deoarece nu puteți utiliza funcții agregate ca parte a unei clauze WHERE. Această soluție ingenioasă înconjoară această limitare!
Exemplul nr. 2:
În această interogare, se folosește o subinterogare pentru a obține un set de rezultate intermediar, astfel încât să putem aplica funcția AVG () la COUNTUL de filme închiriate. Aceasta este ceea ce numesc o dublă agregare, deoarece aplicăm o agregare (AVG) la rezultatul alteia (COUNT).
Această interogare specială este destul de rapidă – durează doar 0,044 secunde – deoarece interogarea internă revine o singură valoare. De obicei, cele mai lente interogări sunt cele care necesită scanări complete ale tabelelor.
Sper că va răspunde la întrebare.
Salutări!
Adam
Răspuns
De obicei ar trebui să scrieți interogări pentru a fi cât mai clare posibil și să lăsați optimizarea la procesorul de interogare al RDBMS și DBA, dacă aveți unul, care este responsabil pentru reglarea designului fizic. ar trebui să aibă ca rezultat o performanță suficient de bună în majoritatea cazurilor, dar există excepții. Uneori, optimizatorul de interogări al unui RDBMS are puncte oarbe sau cazuri nepotrivite.
Acum, dacă fie combinările, fie subinterogările vor fi o problemă pentru un optimizator, este „mult mai probabil să fie în subcercări. Asta pentru că unirea este o caracteristică de bază a limbii pe care toți utilizatorii, în timp ce mulți utilizatori nu folosesc deloc subconsultări. Am constatat că convertirea unei aplicații din Sybase la SQL Server a trebuit să rescriu multe subinterogări ca uniri din cauza unor erori din Microsoft tratarea subinterogărilor – deși într-un caz foarte specific (în care clauza subinterogare unde a inclus un parametru legat). Nu este surprinzător faptul că SQL Server a avut erori în subinterogări, deoarece atât de mulți dintre clienții săi folosesc SQL Server cu editorii de interogări grafice Microsoft, care produc în mod natural îmbinări, dar nu subinterogări.
De obicei, vă sfătuiesc împotriva optimizării premature, dar voi face o excepție aici. Dacă aplicația dvs. trebuie să fie portabilă pe mai multe platforme de baze de date, aș prefera să vă alăturați subconsultărilor în majoritatea cazurilor, deoarece aveți mai multe șanse să întâlniți erori sau opțiuni de optimizare greșite cu subconsultări. aplicația nu trebuie să fie portabilă, scrieți interogarea în ceea ce pare cel mai natural și dacă nu există nicio problemă – care va fi de cele mai multe ori – bine. Dacă există o problemă, rescrieți interogarea în mod diferit pentru a vedea dacă acest lucru vă ajută. Și dacă aveți un DBA, consultați-l cu privire la orice problemă de performanță pe care o aveți.