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
.
quelle
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.Antworten:
Das vom Optimierer verwendete Kostenmodell ist genau das: ein Modell . Es liefert im Allgemeinen gute Ergebnisse über eine Vielzahl von Workloads, über eine Vielzahl von Datenbankdesigns und über eine Vielzahl von Hardware.
Sie sollten im Allgemeinen nicht davon ausgehen, dass einzelne Kostenschätzungen stark mit der Laufzeitleistung einer bestimmten Hardwarekonfiguration korrelieren. Der Zweck der Kostenberechnung besteht darin, dem Optimierer zu ermöglichen, eine fundierte Wahl zwischen möglichen physischen Alternativen für dieselbe logische Operation zu treffen .
Wenn Sie sich wirklich mit den Details befassen, kann ein erfahrener Datenbankprofi (der Zeit hat, eine wichtige Abfrage zu optimieren) oft bessere Ergebnisse erzielen. Insofern können Sie sich die Planauswahl des Optimierers als guten Ausgangspunkt vorstellen. In den meisten Fällen ist dieser Startpunkt auch der Endpunkt, da die gefundene Lösung gut genug ist .
Nach meiner Erfahrung (und Meinung) kostet das SQL Server-Abfrageoptimierungsprogramm Lookups höher als ich es vorziehen würde. Dies ist größtenteils ein Kater aus der Zeit, als zufällige physische E / A im Vergleich zum sequentiellen Zugriff viel teurer waren als dies heute häufig der Fall ist.
Dennoch können Suchvorgänge selbst auf SSDs oder letztendlich sogar beim ausschließlichen Lesen aus dem Speicher teuer sein. Das Durchqueren von B-Baum-Strukturen ist nicht kostenlos. Offensichtlich steigen die Kosten, wenn Sie mehr davon tun.
Die enthaltenen Spalten eignen sich hervorragend für leselastige OLTP-Workloads, bei denen der Kompromiss zwischen der Verwendung des Indexspeichers und den Aktualisierungskosten im Vergleich zur Leseleistung zur Laufzeit sinnvoll ist. Es gibt auch einen Kompromiss in Bezug auf die Planstabilität . Ein vollständig abdeckender Index vermeidet die Frage, wann genau das Kostenmodell des Optimierers von einer Alternative zur anderen wechseln könnte.
Nur Sie können entscheiden, ob sich die Kompromisse in Ihrem Fall lohnen. Testen Sie beide Alternativen an einer repräsentativen Datenstichprobe und treffen Sie eine fundierte Auswahl.
In einem Fragekommentar haben Sie hinzugefügt:
Nein, der Optimierer berücksichtigt die Kosten für verbleibende E / A. In Bezug auf den Optimierer werden nicht SARG-fähige Prädikate in einem separaten Filter ausgewertet. Dieser Filter wird beim Umschreiben nach der Optimierung als Residuum in die Suche oder den Scan verschoben.
quelle