"Warnungen: Betrieb verursachte Rest-E / A" im Vergleich zu Schlüsselsuchen


9

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:

Geben Sie hier die Bildbeschreibung ein

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:

Geben Sie hier die Bildbeschreibung ein

Wenn ich nur den Index ohne Include-Spalten hinzufüge, sieht es so aus, wenn ich die Verwendung des Index erzwinge:

Geben Sie hier die Bildbeschreibung ein

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.


Frage an Sie - Warum sind die Kosten für eine Suche basierend auf Ihrem letzten Absatz basierend auf der Hardware geringer? (Vermutlich dieselbe Hardware, auf der der nicht geclusterte Index ausgeführt wird) Ich bin mir darüber nicht sicher.
George.Palacios

4
Es wird geschätzt , 76,9% der Kosten dieses Plans . Das heißt nicht, dass es teuer ist. Sehen Sie sich die E / A-Kosten von 0,06 im Vergleich zu Ihrem ursprünglichen Plan mit E / A-Kosten über 10 an. Ich denke, Sie sind besser dran, aber Sie sollten mit tatsächlichen Plänen anhand von genügend Daten testen, die wirklich simulieren, wie die Produktion aussehen wird ( und wenn die Abfrage lange genug läuft, um Daten von zu sammeln 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.
Aaron Bertrand

@ AaronBertrand; Die geschätzten Kosten für die Schlüsselsuche betragen 31,0. Wollen Sie mir sagen, dass SQL Server die Kosten der verbleibenden E / A nicht kennt?
Henrik Staun Poulsen

Wo sehen Sie 31.0? Und meinst du 31,0 oder 31,0%?
Aaron Bertrand

1
Nein, ich sage, dass die angezeigten Kosten geschätzte Kosten sind und, wie Paul weiter unten erklärt, nicht unbedingt die Laufzeitleistung widerspiegeln.
Aaron Bertrand

Antworten:


16

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:

Wollen Sie mir sagen, dass SQL Server die Kosten der verbleibenden E / A nicht kennt?

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.


Ich danke Ihnen sehr für Ihre Antwort. Ich werde versuchen, Ihren Ratschlägen zu Testdaten zu folgen, damit ich herausfinden kann, welchen Index ich wirklich brauche. Es ist gut zu wissen, dass Lookups auf SSDs Ihrer Meinung nach weniger kosten sollten. Es ist ein gutes Zeichen für vNext.
Henrik Staun Poulsen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.