Database SQL Server 2017 Enterprise CU16 14.0.3076.1
Wir haben kürzlich versucht, von den standardmäßigen Wartungsjobs für den Index-Neuaufbau auf den Ola Hallengren zu wechseln IndexOptimize
. Die Standardjobs für die Indexwiederherstellung liefen seit einigen Monaten ohne Probleme, und die Abfragen und Aktualisierungen arbeiteten mit akzeptablen Ausführungszeiten. Nach dem Ausführen IndexOptimize
auf der Datenbank:
EXECUTE dbo.IndexOptimize
@Databases = 'USER_DATABASES',
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y'
Leistung war extrem verschlechtert. Eine Update-Anweisung, die zuvor IndexOptimize
100 ms dauerte, dauerte danach 78.000 ms (unter Verwendung eines identischen Plans), und Abfragen führten auch zu einer Verschlechterung um mehrere Größenordnungen.
Da es sich bei dieser Datenbank immer noch um eine Testdatenbank handelt (wir migrieren ein Produktionssystem von Oracle), haben wir auf eine Sicherung zurückgegriffen und diese deaktiviert, IndexOptimize
und alles ist wieder normal.
Wir möchten jedoch verstehen, was IndexOptimize
anders als das "normale" Index Rebuild
Verhalten ist, das diesen extremen Leistungsabfall verursacht haben könnte, um sicherzustellen, dass wir ihn vermeiden, sobald wir in die Produktion gehen. Anregungen, wonach zu suchen ist, wären sehr dankbar.
Ausführungsplan für die Update-Anweisung, wenn sie langsam ist. dh
nach IndexOptimize
Ist-Ausführungsplan (so bald wie möglich)
Ich konnte keinen Unterschied feststellen.
Planen Sie für die gleiche Abfrage , wenn es schnell
Actual Ausführungsplan
quelle
Die Antwort von John ist die richtige Lösung. Dies ist nur eine Ergänzung zu den Teilen des Ausführungsplans, die geändert wurden, und ein Beispiel dafür, wie Sie die Unterschiede mit dem Sentry One Plan Explorer auf einfache Weise erkennen können
Wenn Sie sich alle Abfragepläne ansehen, bei denen sich die Leistung verschlechtert hat, können Sie die Unterschiede leicht erkennen.
Beeinträchtigte Leistung
Zwei Zählungen von über 35 Sekunden CPU-Zeit und verstrichener Zeit
Erwartete Leistung
Viel besser
Die Hauptverschlechterung bei dieser Aktualisierungsabfrage ist zweimal:
Der Ausführungsplan für diese Abfrage mit verminderter Leistung
Der geschätzte Abfrageplan dieser Aktualisierungsabfrage weist sehr hohe Schätzungen auf, als die Leistung beeinträchtigt wurde:
In Wirklichkeit (der tatsächliche Ausführungsplan) muss es noch funktionieren, nur nicht die verrückte Menge, die die Schätzungen zeigen.
Der größte Einfluss auf die Leistung sind die beiden folgenden Verknüpfungen von Scans und Hash-Matches:
Tatsächlicher Scan bei verminderter Leistung # 1
Tatsächlicher Scan bei verminderter Leistung # 2
Der Ausführungsplan für diese Abfrage mit der erwarteten Leistung
Wenn Sie dies mit den Schätzungen (oder tatsächlichen Werten) des Abfrageplans mit der normalen erwarteten Leistung vergleichen, sind die Unterschiede leicht zu erkennen.
Auch die beiden vorherigen Tabellenzugriffe sind nicht einmal aufgetreten:
Diese Beseitigung wird beim Hash-Join nicht angezeigt, da die Build-Eingabe (oben) zuerst in die Hash-Tabelle eingefügt wird. Anschließend werden in dieser Hash-Tabelle Nullwerte geprüft und Nullwerte zurückgegeben.
quelle
Ohne weitere Informationen können wir nur leicht informierte Stiche im Dunkeln durchführen. Bearbeiten Sie die Frage, um ein wenig mehr Informationen bereitzustellen. Beispielsweise können die Abfragepläne für diese Aktualisierungsanweisung, für die Sie vor und nach den Indexwartungsvorgängen die Zeitpläne angegeben haben, aufgrund der aktualisierten Indexstatistiken abweichen ( https://www.brentozar.com/pastetheplan) / ist nützlich, anstatt die Frage mit einem großen XML-Teil zu füllen oder einen Screen-Grab zu geben, der einige der relevanten Informationen, die der Text des Plans enthält, nicht enthält.
Zwei sehr einfache Punkte auf Anhieb:
quelle