Korrigieren Sie den SQL-Index für Partition + Order, um SORT zu entfernen

8

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.

    
Luke McGregor 26.02.2014, 04:13
quelle

1 Antwort

8

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.

  • Entfernen Sie Spalten aus der Abfrage SELECT list, so dass der Index sie abdeckt.
  • Fügen Sie dem Index 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.

    
Martin Smith 26.02.2014, 22:54
quelle

Tags und Links