Frage

Irgendwelche Ideen auf, warum das hinzufügen einer Art zu dieser Abfrage gibt die deutlich schneller als ohne die order by?Ich würde erwarten, dass das Gegenteil, so was könnte dies geschehen?

SELECT TOP (500) r.cID,r.aField,a.Description 
       FROM dbo.tblR r  
            inner join dbo.tblA a on r.aID = a.ID  
            left join dbo.tblX x on x.cID = r.cID 
       WHERE (ISNULL(x.anotherField,'') <> r.anotherField or x.field3 is null) 
            and (r.ID=(select max(ID) from tblR where cID = r.cID and
            ISNULL(aField,'') <> '')) 
            and r.cID in (select ID from tblC)
       ORDER BY r.cID ASC -- when I comment this line out it runs much slower

Die Ausführungspläne werden nicht helfen Sie heraus, viel.

War es hilfreich?

Lösung

Die offensichtlichste Ursache wäre, dass (select max(ID) from tblR where cID = c.cID and ISNULL(aField,'') <> '') sub-query in der WHERE Klausel in Kombination mit der TOP 500 macht die Reihenfolge einen Unterschied machen.

In jedem Fall wird es wohl laufen, der sub-query-individuell für jede Zeile, die sonst vielleicht nicht zurückkehren, bis es gefunden hat, 500, die mit der ganzen WHERE (eigentlich wird es hell genug sein, um zu überprüfen, die anderen Teile des, WO Sie zunächst als Sie sind viel weniger teuer, aber immer noch läuft der sub-query für einen Teil der Zeilen entspricht).Auf eine Vermutung, mehr Zeilen in der Nähe der Spitze, wenn sortiert durch c.cID Spiel derzeit so es hat zu laufen, der sub-query weniger oft zu finden, bevor 500 entspricht, als es beim laufen hinunter die Ergebnisse in der Reihenfolge der query Planer wählt standardmäßig.

(Ich gehe davon aus, dass die cs sollte xs oder Umgekehrt, da sonst die Abfrage nicht ausgeführt wird, als alias c nicht definiert ist überall)

Es lohnt sich, das ausführen von Abfragen, wie im Management Studio mit der "tatsächlichen Abfrageplan" anzeigen eingeschaltet - dann könnten Sie sehen, aus dem Diagramm, die Teile verursacht werden, die differeing Leistung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top