none
Seltsames Verhalten des Query Optimizers bei Left/Inner Joins RRS feed

  • Allgemeine Diskussion

  • Hi,

    ein Kollege fragte mich, warum ein ein Statement auf einmal so lange dauernd würde. Hier mal ein schematisches Beispiel:

    1 SELECT ID from A
    2 LEFT OUTER JOIN B ON (B.ID = A.ID)
    3 LEFT OUTER JOIN C ON (C.ID = B.ID)
    4 LEFT OUTER JOIN D ON (D.ID = C.ID)
    5 JOIN E ON (E.ID = D.ID)
    6 JOIN F ON (F.ID = E.ID)
    7 JOIN G ON (G.ID = A.ID)

    Der Knackpunkt dabei war der Teil in Zeile 7. Lies man diesen weg oder verschob ihn direkt in die 2. Zeile lief alles schnell. Daraufhin schaute ich mir den Ausführungsplan und sah woran es lag. Der SQL führte als erstes die Statements 5+6 und 7 parallel aus. Danach mischte er diese zusammen und da diese nicht miteinander verbunden sind, kam es zu einem Kreuzprodukt was zu einer riesen Menge an Daten führte, die dann in den LEFT OUTER JOINS verwendet wurden. 

    Meine Frage ist nun, warum der Optimizer die INNER JOINS zuerst verbindet, obwohl das zu einem Kreuzprodukt führt. Gibt es dazu einem speziellen Grund oder hat sich der Optimizer da vertüddelt!?

    Gruß

    Martin

    • Typ geändert Ionut DumaModerator Freitag, 19. Juli 2013 13:42 Keine Rueckmeldung des Fragenstellender
    Freitag, 12. Juli 2013 13:52

Alle Antworten

  • Hallo Martin!

    Die Spaltenliste in Deinem Beispiel funktioniert nicht, da hier eine Referenz auf eine der Tabellen notwendig ist. Da könnte auch die Ursache für die Verarbeitungsreihenfolge liegen. Welche Spalten sollten im Select ausgegeben werden?

    Dann ist noch wichtig, welche Version Du vom SQL Server verwendest, da hier immer wieder Optimierungen durchgeführt wurden. In früheren Versionen war es auch mal sinnvoll redundante Beziehungen zu codieren um den Optimizer zu unterstützen.

    Ohne konkrete Zahlen zu Tabellen und Kardinalitäten bleibt nur Spekulation. Grundsätzlich gilt, alles was dem Optimizer bei der Planfindung helfen könnte, auch im Statement zu codieren.


    Einen schönen Tag noch,
    Christoph Muthmann
    Microsoft SQL Server MVP - Blog

    Montag, 15. Juli 2013 09:21
  • *******************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    *******************************************************************************************************
    Freitag, 19. Juli 2013 13:41
    Moderator