Ich habe eine SQL-Anweisung, die ich zu optimieren versuche, um den Sortieroperator
zu entfernen %Vor%Alles was ich gelesen habe (zB Optimizing SQL Abfragen durch Entfernen des Sortieroperators im Ausführungsplan ) schlägt vor, dass dies der richtige Index zum Hinzufügen ist, jedoch scheint er überhaupt keinen Effekt zu haben.
%Vor%
Ich muss etwas vermissen, da ich eine Menge Artikel gelesen habe, die alle einen Index zu suggerieren scheinen, der beide Spalten umfasst, um dieses Problem zu lösen.
Technisch erlaubt Ihnen der Index, den Sie hinzugefügt haben , eine Sortierung zu vermeiden.
Der Index, den Sie erstellt haben, ist jedoch nicht deckungsgleich. Daher müsste SQL Server dann auch 60 Millionen Schlüsselsuchen in die Basistabelle durchführen.
Das Scannen des gruppierten Indexes und das Sortieren im laufenden Betrieb wird als wesentlich kostengünstiger als diese Option betrachtet.
Um den Index automatisch verwenden zu lassen, müssten Sie entweder.
SELECT
list, so dass der Index sie abdeckt. INCLUDE
-d Spalten hinzu. Übrigens: Bei einer Tabelle mit 60 Millionen Zeilen kann es sein, dass Sie selbst dann, wenn Sie versuchen sollten, das Problem mit einem Indexhinweis auf den nicht abdeckenden Index zu erzwingen, immer noch nicht die gewünschten Ergebnisse erzielen.
%Vor%Gibt den Plan
Keine Sortierung außer der Zeile und der Seitenzahl
%Vor%Und versuchen Sie es erneut und Sie erhalten
Jetzt hat es zwei Arten!
Der Scan auf dem NCI befindet sich in RuleInstanceId, Timestamp DESC
order, aber dann ordnet SQL Server ihn in die Reihenfolge der Clustered-Indexschlüssel ( Id ASC
) pro Optimieren der E / A-Leistung durch Sortieren .
Dieser Schritt soll versuchen, die erwarteten massiven Kosten von 60 Millionen zufälligen Suchvorgängen in den gruppierten Index zu reduzieren. Dann wird es wieder in die ursprüngliche RuleInstanceId, Timestamp DESC
Reihenfolge sortiert, in die der Index es lieferte.
Tags und Links sql sql-server performance