it-swarm.com.de

Beeinträchtigt die Sql JOIN-Bestellung die Leistung?

Ich habe gerade etwas SQL aufgeräumt, als ich auf diese Abfrage gestoßen bin:

SELECT 
        jm.IMEI ,
        jm.MaxSpeedKM ,
        jm.MaxAccel ,
        jm.MaxDeccel ,
        jm.JourneyMaxLeft ,
        jm.JourneyMaxRight ,
        jm.DistanceKM ,
        jm.IdleTimeSeconds ,
        jm.WebUserJourneyId ,
        jm.lifetime_odo_metres ,
        jm.[Descriptor]
FROM    dbo.Reporting_WebUsers AS wu WITH (NOLOCK)
        INNER JOIN dbo.Reporting_JourneyMaster90 AS jm WITH (NOLOCK) ON wu.WebUsersId = jm.WebUsersId
        INNER JOIN dbo.Reporting_Journeys AS j WITH (NOLOCK) ON jm.WebUserJourneyId = j.WebUserJourneyId
WHERE   ( wu.isActive = 1 )
        AND ( j.JourneyDuration > 2 )
        AND ( j.JourneyDuration < 1000 )
        AND ( j.JourneyDistance > 0 )

Meine Frage ist, ob es einen Leistungsunterschied in der Reihenfolge der Joins gibt, wie bei der obigen Abfrage, die ich durchgeführt hätte

FROM dbo.Reporting_JourneyMaster90 AS jm

und verband dann die anderen 2 Tabellen mit diesem

42
user1987162

Nein, die Reihenfolge von JOIN wird während der Optimierung geändert.

Die einzige Einschränkung ist die Option FORCE ORDER , die dazu führt, dass Verknüpfungen in der von Ihnen angegebenen Reihenfolge ausgeführt werden.

28
Mike M.

Die Verknüpfungsreihenfolge im SQL2008R2-Server wirkt sich zweifellos auf die Abfrageleistung aus, insbesondere bei Abfragen, bei denen eine große Anzahl von Tabellenverknüpfungen mit where-Klauseln für mehrere Tabellen angewendet wird.

Obwohl die Verknüpfungsreihenfolge in der Optimierung geändert wird, versucht das Optimierungsprogramm nicht alle möglichen Verknüpfungsreihenfolgen. Es hört auf, wenn es das findet, was es für eine praktikable Lösung hält, da die Optimierung wertvolle Ressourcen verbraucht.

Wir haben gesehen, dass Abfragen, die wie Hunde ausgeführt wurden (1 Minute + Ausführungszeit), nur durch Ändern der Reihenfolge der Verknüpfungsausdrücke auf eine Leistung von weniger als einer Sekunde reduziert wurden. Beachten Sie jedoch, dass dies Abfragen mit 12 bis 20 Joins und where-Klauseln in mehreren Tabellen sind.

Der Trick besteht darin, Ihre Reihenfolge festzulegen, damit das Abfrageoptimierungsprogramm herausfindet, was Sinn macht. Sie können Force Order verwenden, aber das kann zu starr sein. Stellen Sie sicher, dass Ihre Verknüpfungsreihenfolge mit den Tabellen beginnt, in denen die Daten durch where-Klauseln am meisten reduziert werden.

39
Kitster

Ich habe ein klares Beispiel für eine innere Verbindung, die die Leistung beeinflusst. Es ist eine einfache Verknüpfung zwischen zwei Tabellen. Einer hatte mehr als 50 Millionen Datensätze, der andere 2.000. Wenn ich aus der kleineren Tabelle eine auswähle und der größeren beitrete, dauert es mehr als 5 Minuten.

Wenn ich aus dem größeren Tisch auswähle und mich dem kleineren anschließe, dauert es 2 Minuten 30 Sekunden.

Dies ist mit SQL Server 2012.

Für mich ist dies nicht intuitiv, da ich für die erste Abfrage den größten Datensatz verwende.

8
Dave

JOIN Reihenfolge spielt keine Rolle, die Abfrage-Engine ordnet ihre Reihenfolge basierend auf Statistiken für Indizes und andere Dinge neu.

Führen Sie zum Testen die folgenden Schritte aus:

  • wählen Sie Tatsächlichen Ausführungsplan anzeigen und führen Sie die erste Abfrage aus
  • ändern Sie die Reihenfolge von JOIN und führen Sie die Abfrage erneut aus
  • ausführungspläne vergleichen

Sie sollten identisch sein, da die Abfrage-Engine sie nach anderen Faktoren neu organisiert.

Wie bereits in anderen Kommentaren erwähnt, können Sie OPTION (FORCE ORDER) verwenden, um genau die Reihenfolge zu verwenden, die Sie möchten, aber möglicherweise ist dies nicht die effizienteste.

Als allgemeine Faustregel sollte die JOIN-Reihenfolge mit der Tabelle der wenigsten Datensätze oben sein und die meisten Datensätze zuletzt, da bei einigen DBMS-Engines die Reihenfolge einen Unterschied machen kann und der Befehl FORCE ORDER verwendet wurde, um die Ergebnisse einzugrenzen .

6
Yaroslav

Normalerweise nicht. Ich bin nicht zu 100% der Meinung, dass dies wörtlich für SQL-Server gilt, aber in Postgres behält sich der Abfrageplaner das Recht vor, die inneren Verknüpfungen nach Belieben neu zu ordnen. Die Ausnahme ist, wenn Sie einen Grenzwert erreichen, ab dem eine Änderung der Reihenfolge zu teuer ist.

4