Beste Antwort
Während Verknüpfungen und Unterabfragen ihren Platz in SQL-Anweisungen haben, versuche ich persönlich, meine Abfragen immer ausschließlich mit Verknüpfungen zu schreiben . In der Zwischenzeit führe ich eine Unterabfrage nur ein, wenn ich die gewünschten Daten ohne eine nicht abrufen kann.
Der Grund dafür ist, dass Verknüpfungen tendenziell schneller ausgeführt werden. Tatsächlich würde ich sogar sagen, dass die Abrufzeit der Abfrage mithilfe von Verknüpfungen fast immer schneller ist als die einer Unterabfrage.
Der Grund dafür ist, dass Verknüpfungen den Rechenaufwand für die Abfrage verringern Datenbank durch Ersetzen mehrerer Abfragen durch eine Join-Abfrage. Dies wiederum nutzt die Möglichkeiten der Datenbank zum Durchsuchen, Filtern und Sortieren von Datensätzen besser aus.
Wenn Sie einer Abfrage mehr Verknüpfungen hinzufügen, muss der Datenbankserver natürlich mehr Arbeit leisten, die übersetzt wird
Während Verknüpfungen erforderlich sind, um Daten aus einer normalisierten Datenbank abzurufen, ist es wichtig, dass Verknüpfungen korrekt geschrieben werden, da falsche Verknüpfungen zu schwerwiegenden Leistungseinbußen und ungenauen Abfrageergebnissen führen können.
In einigen Fällen können Unterabfragen komplexe Verknüpfungen und Vereinigungen mit nur minimalen negativen Auswirkungen auf die Leistung ersetzen.
Beispiele für Unterabfragen
Manchmal kommt man mit einer Unterabfrage nicht wirklich herum. Hier einige Beispiele für die Verwendung der Sakila-Beispieldatenbank für MySQL und meines Navicat -Datenbankentwicklungs- und Administrationsclients.
Beispiel 1: Verwenden einer Aggregatfunktion als Teil einer JOIN-Klausel
In den meisten Fällen werden Tabellen in einem gemeinsamen Feld verknüpft. Tatsächlich ist es nicht ungewöhnlich, dass das gemeinsame Feld denselben Namen hat, um zu zeigen, dass es sich um dieselben Daten handelt. In der folgenden Abfrage wird die Kundentabelle jedoch mit dem neuesten (MAX) create\_date verknüpft, sodass die Abfrageergebnisse für den Kunden gelten, der sich zuletzt angemeldet hat.
Eine Unterabfrage wird verwendet, da Sie keine Aggregatfunktionen verwenden können als Teil einer WHERE-Klausel. Diese geniale Problemumgehung umgeht diese Einschränkung!
Beispiel 2:
In dieser Abfrage wird eine Unterabfrage verwendet, um eine Zwischenergebnismenge abzurufen, damit wir die Funktion AVG () auf die Anzahl der ausgeliehenen Filme anwenden können. Dies nenne ich eine Doppelaggregation, weil wir eine Aggregation (AVG) auf das Ergebnis einer anderen (COUNT) anwenden.
Diese spezielle Abfrage ist ziemlich schnell – dauert nur 0,044 Sekunden -, da die innere Abfrage zurückkehrt ein einzelner Wert. Normalerweise sind die langsamsten Abfragen diejenigen, die vollständige Tabellenscans erfordern.
Hoffe, dass Ihre Frage beantwortet wird.
Grüße!
Adam
Antwort
Normalerweise sollten Sie Abfragen so klar wie möglich schreiben und die Optimierung dem Abfrageprozessor des RDBMS und dem DBA überlassen, falls Sie einen haben, der für die Optimierung des physischen Designs verantwortlich ist sollte in den meisten Fällen zu einer ausreichend guten Leistung führen, es gibt jedoch Ausnahmen. Manchmal weist der Abfrageoptimierer eines RDBMS blinde Flecken oder schlechte Fälle auf.
Nun, wenn entweder Verknüpfungen oder Unterabfragen ein Problem darstellen Als Optimierer ist es viel wahrscheinlicher, dass es sich um Unterabfragen handelt. Dies liegt daran, dass Join ein grundlegendes Merkmal der Sprache ist, die jeder Benutzer verwendet, während viele Benutzer überhaupt keine Unterabfragen verwenden. Ich habe darin festgestellt, dass eine App aus Sybase konvertiert wird In SQL Server musste ich viele Unterabfragen aufgrund von Fehlern in Microsoft als Joins umschreiben Behandlung von Unterabfragen – wenn auch in einem ganz bestimmten Fall (wobei die Unterabfrage where-Klausel einen gebundenen Parameter enthielt). Es ist nicht überraschend, dass SQL Server Fehler in Unterabfragen hatte, da so viele seiner Kunden SQL Server mit den grafischen Abfrageeditoren von Microsoft verwenden, die natürlich Verknüpfungen, aber keine Unterabfragen erzeugen.
Ich rate normalerweise von einer vorzeitigen Optimierung ab. Aber ich mache hier eine Ausnahme. Wenn Ihre Anwendung auf mehrere Datenbankplattformen portierbar sein muss, würde ich in den meisten Fällen Verknüpfungen zu Unterabfragen bevorzugen, da Sie mit größerer Wahrscheinlichkeit auf Fehler oder schlechte Optimierungsoptionen bei Unterabfragen stoßen Die Anwendung muss nicht portabel sein. Schreiben Sie die Abfrage auf die natürlichste Art und Weise, und wenn es kein Problem gibt – was meistens der Fall sein wird -, ist das in Ordnung. Wenn es ein Problem gibt, schreiben Sie die Abfrage anders, um festzustellen, ob dies hilfreich ist. Wenn Sie einen DBA haben, wenden Sie sich an ihn, wenn Sie Leistungsprobleme haben.