Ist ein JOIN schneller als ein WO?
Angenommen ich habe zwei Tabellen, die miteinander verknüpft sind (ein Fremdschlüssel auf die andere) :
CREATE TABLE Document (
Id INT PRIMARY KEY,
Name VARCHAR 255
)
CREATE TABLE DocumentStats (
Id INT PRIMARY KEY,
DocumentId INT, -- this is a foreign key to table Document
NbViews INT
)
Ich weiß, dies ist nicht der intelligenteste Weg, Dinge zu tun, aber dies ist das beste Beispiel, das ich kommen konnte mit.
Nun möchte ich, um alle Dokumente mit mehr als 500 views. Die zwei Lösungen, die mir einfallen, sind :
SELECT *
FROM Document, DocumentStats
WHERE DocumentStats.Id = Document.Id
AND DocumentStats.NbViews > 500
oder :
SELECT *
FROM Document
INNER JOIN DocumentStats
ON Document.Id = DocumentStats.Id
WHERE DocumentStats.NbViews > 500
Sind beide Abfragen gleichwertig, oder gibt es eine Möglichkeit, die ist weit besser als die anderen ? Wenn ja, warum ?
Ich bin mir bewusst, dass mein Beispiel nicht perfekt ist, und dass die Abfragen können müssen einige tune-up, aber ich hoffe, du hast den Punkt 😉 !
EDIT: wie gewünscht die Antworten, diese Frage richtete sich an MSSQL, aber ich wäre daran interessiert zu wissen, wenn es anders ist bei anderen DB-engines (MySQL, etc...)
InformationsquelleAutor der Frage Wookai | 2009-07-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Theoretisch, Nein, es sollte nicht schneller. Der query optimizer sollte in der Lage sein zum generieren eines identischen Ausführungsplan. Jedoch, einige DB-Motoren produzieren können, bessere Ausführungspläne für eine von Ihnen (wahrscheinlich nicht passieren, für so eine einfache Abfrage, die für die Komplex genug sind). Testen Sie beide und sehen (auf der DB-engine).
InformationsquelleAutor der Antwort Mehrdad Afshari
Performance von "JOIN" statt "WO"... alles hängt davon ab, wie gut die Datenbank-engine ist in der Lage, die Abfrage zu optimieren für Sie. Es berücksichtigt alle Indizes, die man haben könnte, auf die Spalten, die zurückgegeben wird, und berücksichtigen, dass die Leistung der WHERE-und JOIN-Klauseln kommen auch auf die physische Datenbank-Datei selbst und seine Fragmentierung Ebene und einmal der Speicher-Technologie, die Sie verwenden, um die Datenbank zu speichern Dateien auf.
MSSql-server führt die Abfragen in der folgenden Reihenfolge (das sollte Ihnen eine Vorstellung von den Funktionen der WHERE-und JOIN-Klauseln)
Microsoft Sql Server-Abfrage, um
folgende ist entnommen aus der hervorragenden Reihe von Büchern über Microsoft SQL Server, Inside Microsoft SQL Server 2005: T-SQL-Abfragendie gefunden werden können hier
InformationsquelleAutor der Antwort Mike J
Gibt es keine Möglichkeit richtig beantworten diese-ohne Begrenzung-in eine Zieldatenbank.
Für MS-SQL-sowohl Abfragen als Ergebnis in der gleichen Ausführung Pläne, aber Bedenken Sie:
Ist wirklich sehr riskant, da es leicht zu vergessen, dass die join-Bedingung in der WHERE-Klausel und am Ende mit einem bösen cross join.
InformationsquelleAutor der Antwort Sam Saffron
In MySQL zumindest, das Sie beide optimiert werden, um die gleiche Abfrage.
InformationsquelleAutor der Antwort Greg
Es ist ein "standard" zu verwenden, die INNER JOIN-syntax, obwohl praktisch gleichwertig. Der Hauptgrund, warum es verwendet werden soll, ist für Klarheit und Beweglichkeit Zwecke, wie es im Einklang mit der OUTER-JOIN-syntax.
InformationsquelleAutor der Antwort Sev
Wenn Sie Sqlite verwenden: Die where-syntax ist etwas schneller, weil Sqlite ersten übersetzt die join-syntax in der where-syntax vor dem ausführen der Abfrage.
InformationsquelleAutor der Antwort Theo
Wenn Sie reden, speziell über SQL Server, dann auf jeden Fall sollte man mit dem INNER JOIN-syntax. Abgesehen davon, dass (persönliche Meinung-Alarm!) einfacher zu Lesen und mehr deutlich, in der Absicht, es ist, wie der SQL Server 2005 keine entsprechende syntax für outer-joins. *= Und =* syntax ist nicht standardmäßig unterstützt im Jahr 2005-Sie brauchen, um einen Kompatibilitätsmodus zu unterstützen. Es wird schließlich entfernt werden, möglicherweise, sobald die nächste Version (oder auch nicht!)
Bedeutet dies:
Beachten Sie auch, dass entgegen der landläufigen Meinung, die zwei sind nicht entspricht. Einige Sachen sind viel mehr umständlich, und einige sind einfach nicht möglich. Kalen Delaney ist Inside SQL Server 2000 deckt einige Beispiele; nicht sicher, ob die neueren Editionen zu tun, denn das join-syntax ist veraltet sowieso.
InformationsquelleAutor der Antwort Cowan
Explizite joins sind leichter zu pflegen als die Absicht der Abfrage viel übersichtlicher. Auch Sie unterliegen nicht dem zufälligen cross verbindet also, wenn Sie einen cross join in der Abfrage, der Betreuer weiß, dass es beabsichtigt war, dort zu sein.
Wenn Sie jemals brauchen, um outer-joins verwenden, sollten Sie wissen, dass die *= syntax ist veraltet in SQL Server und wird bald entfernt werden. Auch ist es derzeit nicht funktioniert wie erwartet die ganze Zeit und kann nicht liefern korrekte Ergebnisse und sollten daher NIE verwendet werden. Mischen explizite outer-joins und where-Klausel joins (implizite joins) macht eine Abfrage viel schwieriger für einen maintainer zu Lesen und zu verstehen.
InformationsquelleAutor der Antwort HLGEM
In MSSQL, die beiden Abfragen werden erstellt, um den gleichen execution-plan, also gibt es keinen Unterschied. Es geht mehr um die Lesbarkeit - ich denke die VERKNÜPFUNG ist einfacher zu Lesen, so dass ich es auch benutzen.
InformationsquelleAutor der Antwort SqlRyan
Ich denke, dass es nicht einen Unterschied machen, auch. Werden Sie sicher, dass Sie überprüfen können, ob die explain-plan der beiden Abfragen identisch. Um sich den plan erklären in MySQL Sie haben, um das "erklären" - Schlüsselwort vor der Anweisung, z.B.:
Ich bin sicher, es existiert ein äquivalent in MSSQL zu.
Übrigens:
Das sieht aus wie das ist eine 1:1 Beziehung, also würde ich einfach die nbviews-Attribut direkt in der Document-Tabelle, daher können Sie eine Verknüpfung.
InformationsquelleAutor der Antwort samson