Ich habe diese Warnung in SQL Server 2017-Ausführungsplänen gesehen:
Warnungen: Der Betrieb verursachte verbleibende E / A. Die tatsächliche Anzahl der gelesenen Zeilen betrug (3.321.318), aber die Anzahl der zurückgegebenen Zeilen betrug 40.
Hier ist ein Ausschnitt aus SQLSentry PlanExplorer:
Um den Code zu verbessern, habe ich einen nicht gruppierten Index hinzugefügt, damit SQL Server zu den relevanten Zeilen gelangen kann. Es funktioniert gut, aber normalerweise gibt es zu viele (große) Spalten, um sie in den Index aufzunehmen. Es sieht aus wie das:
Wenn ich nur den Index ohne Include-Spalten hinzufüge, sieht es so aus, wenn ich die Verwendung des Index erzwinge:
Offensichtlich ist SQL Server der Ansicht, dass die Schlüsselsuche viel teurer ist als die verbleibende E / A. Ich habe (noch) ein Test-Setup ohne viele Testdaten, aber wenn der Code in Produktion geht, muss er mit viel mehr Daten arbeiten, daher bin ich mir ziemlich sicher, dass eine Art NonClustered-Index benötigt wird.
Sind Schlüsselsuchen wirklich so teuer , wenn Sie auf SSDs laufen, dass ich Vollfettindizes erstellen muss (mit vielen Include-Spalten)?
Ausführungsplan: https://www.brentozar.com/pastetheplan/?id=SJtiRte2X Er ist Teil einer lange gespeicherten Prozedur. Suchen Sie nach IX_BatchNo_DeviceNo_CreatedUTC
.
sys.dm_exec_query_profiles
, werden wir sie von den tatsächlichen Kosten im Vergleich zu den geschätzten Kosten neu berechnen . Verwenden Sie die geschätzten Kosten% nicht mehr als absoluten Kostenindikator - sie sind relativ und gehen oft zum Mittagessen.