SQL - Filtern große Tabellen mit joins - best practices
Ich habe eine Tabelle mit vielen Daten und ich müssen sich mit einigen anderen großen Tabellen.
Nur einen kleinen Teil meiner Tabelle ist tatsächlich relevant für mich jedes mal.
Wann ist es am besten zum filtern meiner Daten?
-
In der where-Klausel der SQL.
-
Erstellen Sie eine temporäre Tabelle mit bestimmten Daten-und nur dann beitreten.
-
Fügen Sie das Prädikat an die erste inner join ON-Klausel.
-
Eine andere Idee.
1.
Select *
From RealyBigTable
Inner Join AnotherBigTable On …
Inner Join YetAnotherBigTable On …
Where RealyBigTable.Type = ?
2.
Select *
Into #temp
From RealyBigTable
Where RealyBigTable.Type = ?
Select *
From #temp
Inner Join AnotherBigTable On …
Inner Join YetAnotherBigTable On …
3.
Select *
From RealyBigTable
Inner Join AnotherBigTable On RealyBigTable.type = ? And …
Inner Join YetAnotherBigTable On …
Andere Frage:
Was passiert als erstes? Join
oder Where
?
InformationsquelleAutor Gil Stal | 2011-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil Sie mit INNEREN JOINs im WHERE-oder JOIN-Debatte nur hängt von Ihrem Geschmack und Stil. Persönlich mag ich die Verbindung zwischen den zwei Tabellen (z.B. foreign key-Einschränkung) in der ON-Klausel, und der eigentliche Filter gegen Daten in der WHERE-Klausel.
SQL Server analysieren Sie die Abfrage in der gleichen token-Baum, und wird deshalb bauen die identische Abfrage-Ausführungspläne.
Wenn Sie [LINKS/RECHTS] OUTER-JOINS anstelle, es ist ein himmelweiter Unterschied, da nicht nur wird die Leistung wohl anders, aber auch sehr wahrscheinlich die Ergebnisse.
Zur Beantwortung deiner anderen Fragen:
Wann ist es am besten zum filtern meiner Daten?
In der WHERE-oder ON-Klausel, die beide gesehen werden als die gleichen. Für 3, die "ersten inner join" hat keine Relevanz. In einem multi-table-INNER-JOIN-Szenario, es ist wirklich egal, das reicht erstmal (in der Abfrage), wie der Abfrage-Optimierer shuffle die Reihenfolge wie es gerade passt.
Mithilfe einer temp-Tabelle ist völlig überflüssig und wird nicht helfen, weil Sie zu extrahieren die relevanten Teile ohnehin - das ist, was ein JOIN wäre nicht so gut. Außerdem, wenn Sie hatte einen guten index auf den JOIN-Bedingungen/WHERE-filter, der index wird verwendet, um nur besuchen die relevanten Daten ohne Blick auf den rest der Tabelle(N).
bitte siehe Antwort bearbeitet
InformationsquelleAutor RichardTheKiwi
Dann sollten Sie Ihre Abfrage im management studio, tick "tatsächlichen Ausführungsplan einschließen", und führen Sie es. Auf diese Weise erhalten Sie die genaue Antwort, was der SQL-server nicht mit Ihrer Abfrage. Ab dann, können Sie vorwärts zu bewegen mit der Optimierung.
Im Allgemeinen:
InformationsquelleAutor Endy Tjahjono
In einem anständigen cost-based-query-Planer, was passiert ist (Ihr Fall)
join Konditionen und die where-Bedingungen analysiert werden, auf gleicher Ebene
ist die Art der Verknüpfung und Statistiken bestimmt den Pfad (was zuerst Eintritt) - in der Weise, dass die kleinste Zwischenergebnisse abgerufen werden (zuletzt I/O > die Schnellste Abfrage)
InformationsquelleAutor Unreason