Ich habe eine Stored Procedure in SQL Server 2005, und wenn ich es ausführe und ich mir den Ausführungsplan anschaue, merke ich, dass es einen Clustered-Index-Scan macht, und das kostet ihn 84%. Ich habe gelesen, dass ich einige Dinge ändern muss, um einen Clustered Index Seek zu bekommen, aber ich weiß nicht, was ich ändern soll.
Ich werde jede Hilfe mit diesem schätzen.
Danke,
Brian
Ohne jedes Detail ist es schwer zu erraten, was das Problem ist und ob es überhaupt ein Problem ist. Die Wahl eines Scans anstelle einer Suche könnte durch viele Faktoren gesteuert werden:
SELECT * FROM <table>
. Dies ist ein trivialer Fall, der perfekt durch einen Index-Scan mit Clustern abgedeckt wäre, ohne dass etwas anderes in Betracht gezogen werden müsste. WHERE column = @value
, aber die Spalte ist VARCHAR
(Ascii) und @value ist NVARCHAR
(Unicode). (foo, bar)
, die WHERE-Klausel befindet sich jedoch nur in bar
. Dies sind einige schnelle Hinweise, warum ein Clustered-Index-Scan vorhanden sein kann, wenn eine Clustered-Index-Suche erwartet wird. Die Frage ist extrem generisch und es ist unmöglich, eine Antwort "warum" zu geben, außer sich auf einen 8-Ball zu verlassen. Nun, wenn ich Ihre Frage richtig dokumentiert und korrekt artikuliert habe, bedeutet dies, dass Sie einen eindeutigen Datensatz basierend auf einem clustered Schlüsselwert suchen, um einen Clustered Index seek zu erwarten. In diesem Fall muss das Problem mit der SARGability der WHERE-Klausel gelöst werden.
Wenn die Abfrage mehr als einen bestimmten Prozentsatz der Zeilen in der Tabelle einbezieht, wählt das Optimierungsprogramm einen Scan statt einer Suche aus, da es vorhersagt, dass es in diesem Fall weniger Festplatten-IOs benötigt ( Für jede Zeile, die es zurückgibt, benötigt es im Index einen Datenträger-E / A pro Ebene. Für einen Suchvorgang gibt es in der gesamten Tabelle nur einen Datenträger-E / A pro Zeile.
Wenn also beispielsweise im b-tree-Index 5 Ebenen vorhanden sind, ist es günstiger, die gesamte Tabelle zu lesen, wenn die Abfrage mehr als 20% der Zeilen in der Tabelle generiert, als 5 IOs für jede der Zeilen zu erstellen die 20% Zeilen ...
Können Sie die Ausgabe der Abfrage etwas eingrenzen, um die Anzahl der Zeilen zu reduzieren, die von diesem Schritt zurückgegeben werden? Das würde ihm helfen, die Suche über den Scan zu wählen.
Tags und Links sql-server-2005 clustered-index