Kann die Neuerstellung von Indizes nach Abschluss der Neuerstellung zu einer schlechteren Leistung führen?

7

Wir haben eine Kundendatenbank, die stark fragmentiert ist - praktisch jede Tabelle mit mehr als 1000 Seiten weist eine Fragmentierung von> 95% auf. Füllfaktoren werden auf sinnvolle Werte gesetzt, aber die Nutzung des Seitenbereichs ist für die meisten Tabellen bei weitem kein Füllfaktor.

Dies ist das Ergebnis einer fehlenden Wartung der Datenbank.

Durch die Neuerstellung der Indizes mit Ola Hallengrens IndexOptimize wird die Fragmentierung wie erwartet reduziert. Auf der vorhandenen Produktionshardware verbessert sich die Leistung der Anwendung wie erwartet. Alle Metriken, die ich normalerweise verwende - Client-Statistiken zu umfangreichen Abfragen, Profiler-Dauer, Lese- / Schreibstillständen, Anwendungsprotokollen und Benutzerwahrnehmung - weisen auf eine verbesserte Leistung hin.

Ein neuer Datenbankserver mit Intel PCIe-SSDs zeigt jedoch das Gegenteil von dem, was wir erwarten. Die Anwendung ist stark fragmentiert und bietet eine gute Leistung. Nach dem Wiederherstellen von Indizes ist die Leistung der Anwendung schlecht. Einige Operationen, die ~ 90s dauerten, dauern jetzt ~ 6 Minuten. Keine der anderen Metriken scheint jedoch darauf hinzudeuten, dass das System langsamer läuft.

Ist das etwas, was jemand anderes erlebt hat?

Cybergibbons
quelle
3
Versuchen Sie vielleicht, Ihre Abfragepläne zu überprüfen. Möglicherweise erleben Sie das Schnüffeln von Parametern.
Reagiert
2
Stimmen Sie @Reaces zu. Durch die Neuerstellung von Indizes werden Statistiken aktualisiert und vorhandene Abfragepläne ungültig gemacht. Vielleicht hatten Sie Pech mit den Parameterwerten, die beim Kompilieren des neuen Plans übergeben wurden.
Martin Smith
Ok - das war mir nicht bewusst. Ich denke, ich kann dies mit "DBCC FREEPROCCACHE" auf dem fragmentierten System testen und sehen, wie stark sich die Leistung bei genau derselben Operation verschlechtert.
Cybergibbons
2
Und bevor Sie dies tun, werfen Sie einen Blick auf STATISTICS IORead Ahead Reads / Physical Reads, um festzustellen, ob die 6-Minuten-Abfrage überhaupt von der Disc liest.
Martin Smith
Das Gleichgewicht zwischen Lese- und Schreibvorgängen ist extrem hoch und das System verfügt über mehr als genug RAM, um die gesamte Datenbank im Speicher zu halten. Daher würde ich mir vorstellen, dass die Lesevorgänge von der Disc niedrig sein sollten - was das Verhalten merkwürdiger macht.
Cybergibbons

Antworten:

11

Ja, das Neuerstellen von Indizes (insbesondere auf SSDs) kann zu einer schlechteren Leistung führen. Die meisten Hochgeschwindigkeits-SSDs bevorzugen viele kleinere Blockanforderungen anstelle weniger größerer Anforderungen. Dies ist genau das entgegengesetzte Muster, das von traditionellem Spinnrost bevorzugt wird.

Angenommen, Sie haben einen stark fragmentierten B-Baum. Da auf der Festplatte nichts bestellt ist, werden in der Regel viele 8-KB-E / A-Anforderungen zum Scannen des Baums ausgegeben. Wenn Sie den Baum defragmentieren, können Sie in einer einzigen Anforderung bis zu 512 KB abrufen. Diese großen Anforderungen haben eine höhere Latenz auf der SSD, da die SSD sie intern in 8-KB-Blöcke aufteilt (im Gegensatz zu einer Festplatte, die eine sequentielle E / A ausgibt). Für sehr viele Fälle: Höhere Festplattenlatenz = langsamere Abfragen

Stellen Sie dennoch sicher, dass Sie sicherstellen, dass Sie tatsächlich dieselben Abfragepläne erhalten, die Sie vor der Neuerstellung erhalten haben.

Und schließlich: Wenn Sie nicht über genügend Speicherplatz verfügen, warum verschwenden Sie Ihre wertvolle DBA-Zeit mit Indexwiederherstellungen, wenn Sie auf einer SSD ausgeführt werden?

Thomas Kejser
quelle
Die Neuerstellungen werden aus mehreren Gründen durchgeführt - einem konsistenten Wartungsplan für alle Datenbanken, ohne sich um die zugrunde liegende Hardware zu kümmern, der Annahme, dass die Neuerstellung unabhängig von der Hardware keine Nachteile mit sich bringt, und einer vernünftigen Nutzung des Seitenbereichs (I. Ich denke, dies wird unabhängig vom Speicher Probleme verursachen.
Cybergibbons
1
Möglicherweise möchten Sie verschiedene Wiederherstellungsstrategien für Datenbanken in Betracht ziehen, die sich auf einer SSD befinden. Möglicherweise brennen Sie einfach CPU- und SSD-Schreibzyklen ohne Verstärkung (oder sogar ohne Regression).
Thomas Kejser
Wie erklären Sie sich, dass die Leistung von 90 Sekunden auf 360 Sekunden gesunken ist, indem Sie nur einen Index neu erstellt haben? Die Leistung sollte nicht sinken, da die SSD genau das Gleiche wie zuvor tut. @Cybergibbons, können Sie überprüfen, ob sich die Ausführungspläne geändert haben? Das klingt eher nach einem möglichen Problem.
ora-600
Wie ora-600 sagt, besteht Ihre erste Anlaufstelle darin, zu überprüfen, ob sich die Pläne nicht geändert haben. Dies ist bei weitem die wahrscheinlichste Erklärung. Wenn Sie festgestellt haben, dass Sie im Vorher / Nachher-Szenario dieselben Pläne erhalten, können Sie sich mit den Sonderfällen einer langsameren SSD befassen. Auch wäre nützlich, wenn Sie die Abfrage zu Ihrer Frage hinzufügen.
Thomas Kejser
1
@ ora-600: Die SSD führt den gleichen Lesevorgang durch, aber die Reihenfolge, in der diese Lesevorgänge ausgeführt werden, ist wichtig. Nehmen Sie das Beispiel einer einfachen Schleifenverbindung zwischen zwei Tabellen mit einem Bereichsscan und einer niedrigen Cache-Trefferquote. Die äußere Tabelle muss warten, bis die innere E / A abgeschlossen ist, um Fortschritte zu erzielen. Wenn der innere Scan häufig in kleinen Stücken gleichzeitig zurückkehrt, beschleunigt der äußere Teil der Schleife den Fortschritt und erhöht die Parallelität. Die Gesamtzahl der E / A-Operationen steigt (obwohl die gelesenen Bytes gleich sind), aber auch die Geschwindigkeit des Plans
Thomas Kejser
8

Die Anwendung ist stark fragmentiert und bietet eine gute Leistung. Nach dem Wiederherstellen von Indizes ist die Leistung der Anwendung schlecht.

Eine wahrscheinliche Ursache ist, dass die nach dem Wiederaufbau geänderte (vermutlich reduzierte) Größe der Strukturen bedeutet, dass der Optimierer einen anderen Plan wählt. Eine der wichtigsten Eingaben in das Kalkulationsmodell des Optimierers ist die Anzahl der Seiten, die jeder Planbetreiber voraussichtlich verarbeiten wird.

Das Ändern der Anzahl der Seiten in einer Struktur kann leicht den Unterschied zwischen der Auswahl eines Hash- oder Merge-Joins durch den Optimierer und einer Strategie für verschachtelte Schleifen (mit oder ohne Spool) ausmachen. Das ist nur ein Beispiel; Kostenunterschiede können sich auf alle Aspekte der Planauswahl auswirken, einschließlich der Entscheidung, ob Parallelität verwendet wird oder nicht.

Um die Art von Leistungsunterschieden zu machen, die Sie beobachten (und auch das Fehlen physischer E / A berücksichtigen), scheint dies die wahrscheinlichste Erklärung zu sein (vorausgesetzt, Sie können das "schlechte" Parameter-Sniffing eliminieren).

Ohne Details (idealerweise Pläne und detaillierte Metriken für eine einzelne Instanz des Problems vor und nach dem Wiederaufbau) ist die aktuelle Frage wohl sehr meinungsbasiert, was sie für diese Site nicht zum Thema machen würde.

Paul White 9
quelle