it-swarm.com.de

Wann sollte ich Indizes neu erstellen?

Wann sollte ich die Indizes in meiner relationalen Datenbank (SQL Server) neu erstellen?

Gibt es Gründe, Indizes regelmäßig neu zu erstellen?

57
Nick Chammas

Auf die Gefahr hin, in meiner Antwort viel zu allgemein zu sein, werde ich sagen, dass Sie regelmäßig einen Indexwartungsprozess durchführen sollten. Ihr Indexwartungsprozess sollte jedoch nur die Indizes neu erstellen/reorganisieren, die dies speziell erfordern.

Dies wirft die Frage auf: Wann muss ein Index neu erstellt oder organisiert werden? Rolando hat das gut angesprochen. Auch hier riskiere ich, extrem breit zu sein. Ein Index muss gewartet werden, wenn die Fragmentierungsstufe die Leistung beeinträchtigt. Dieser Fragmentierungsgrad kann je nach Größe und Zusammensetzung des Index variieren.

Wenn ich für SQL Server spreche, neige ich dazu, eine Indexgröße und eine Indexfragmentierungsstufe zu wählen, ab wann ich mit der Indexpflege beginne. Wenn ein Index weniger als 100 Seiten enthält, werde ich keine Wartung durchführen.

Wenn ein Index zwischen 10% und 30% fragmentiert ist, werde ich REORGANIZE den Index und UPDATE die Statistik. Wenn ein Index zu mehr als 30% fragmentiert ist, werde ich den Index REBUILD - ohne UPDATE STATISTICS, da dies vom REBUILD erledigt wird. Beachten Sie jedoch, dass bei einer Neuerstellung nur das Statistikobjekt aktualisiert wird, das direkt mit dem Index verknüpft ist. Andere Spaltenstatistiken müssen separat gepflegt werden.

Diese Antwort ist wirklich nur ein langer Weg zu sagen: Ja, Sie sollten eine routinemäßige Indexpflege durchführen, aber nur für die Indizes, die sie benötigen.

42
Matt M

Wann sollte ich die Indizes in meiner relationalen Datenbank (z. B. SQL Server) neu erstellen?

Sie sollten Indizes neu erstellen, wenn sie durch spezielle Ereignisse stark fragmentiert werden. Beispielsweise führen Sie eine große Massenladung von Daten in eine indizierte Tabelle durch.

Gibt es einen Grund, Indizes regelmäßig neu zu erstellen?

Was ist, wenn Ihre Indizes aufgrund regelmäßiger Aktivitäten regelmäßig fragmentiert werden? Sollten Sie regelmäßige Umbauten planen? Wie oft sollten sie rennen?

Tom Kyte , in diesem klassischer Ask Tom-Thread , empfiehlt:

Die Zeitverzögerung zwischen Indexwiederherstellungen sollte ungefähr FÜR IMMER betragen.

...

Ich weiß nicht, wie ich es besser sagen soll - der Index möchte groß und fett sein und zusätzlichen Platz bieten. Es befindet sich in einer Spalte, die Sie aktualisieren, und verschiebt den Indexeintrag von Ort zu Ort im Index. An einem Tag hat die Zeile den Code "A", am nächsten Tag lautet der Code "G", dann "Z", dann "H" und so weiter. Der Indexeintrag für die Zeile verschiebt sich also von Ort zu Ort im Index. Dabei braucht es Platz - wenn der Platz nicht da ist, teilen wir den Block in zwei Teile - und schaffen Platz. Jetzt wird der Index fett. Im Laufe der Zeit ist der Index 2-3x so groß wie zu Beginn und "halb oder mehr leer". Dies ist jedoch in Ordnung, da Sie Zeilen verschieben. Wenn wir jetzt die Reihen verschieben, müssen wir keine Blöcke mehr teilen, um Platz zu schaffen - der Raum ist bereits verfügbar.

Dann kommen Sie und erstellen den Index neu oder löschen ihn und erstellen ihn neu (was die gleichen Auswirkungen hat - nur die Neuerstellung ist "sicherer" - hat keine Chance, den Index zu verlieren und kann schneller sein, da der Index von neu erstellt werden kann Scannen des vorhandenen Index anstelle des Scannens der Tabelle und Sortieren und Erstellen eines neuen Index). Jetzt ist der ganze schöne Raum weg. Wir beginnen erneut damit, die Blöcke zu teilen - und bringen uns wieder dorthin zurück, wo wir angefangen haben.

Sie haben keinen Platz gespart.

Der Index ist wieder so wie er war.

Sie würden nur Ihre Zeit damit verschwenden, es wieder aufzubauen, wodurch sich dieser Teufelskreis wiederholt.

Die Logik hier ist solide, aber sie ist gegen ein leselastiges Lastprofil vorgespannt.

Ein "fetter" Index (d. H. Einer mit vielen Lücken) bietet in der Tat viel Platz für neue und verschobene Zeilen, wodurch Seitenaufteilungen reduziert und Ihre Schreibvorgänge beschleunigt werden. Wenn Sie jedoch aus diesem Fettindex lesen, müssen Sie mehr Seiten lesen, um dieselben Daten zu erhalten, da Sie jetzt mehr leeren Raum durchsuchen. Dies verlangsamt Ihre Lesevorgänge.

In leselastigen Datenbanken möchten Sie Ihre Indizes regelmäßig neu erstellen oder organisieren. (Wie oft und unter welchen Bedingungen? Matt M hat bereits eine konkrete Antwort auf diese Frage.) In Datenbanken mit ungefähr gleichwertigen Lese- und Schreibaktivitäten oder in Datenbanken mit hoher Schreiblast sind Sie wahrscheinlich Beeinträchtigung der Leistung Ihrer Datenbank durch regelmäßige Neuerstellung von Indizes.

19
Nick Chammas

Die meisten Leute bauen sie regelmäßig wieder auf, damit sie nie fragmentiert werden. Wann Sie sie neu erstellen müssen, hängt davon ab, wie schnell sie fragmentiert werden. Einige Indizes müssen häufig neu erstellt werden, andere grundsätzlich nie. Schauen Sie sich das Skript the SQLFool an, das eine Menge Dinge für Sie herausfindet.

11
mrdenny

Wie in der akzeptierten Antwort von Matt M erwähnt, gilt als Faustregel, dass Indizes, die zu über 30% fragmentiert sind, neu erstellt werden sollten.

Mithilfe dieser Abfrage können Sie herausfinden, wie viele Indizes zu über 30% fragmentiert sind (wenn Sie welche haben, sollten Sie sie neu erstellen):

SELECT DB_NAME() AS DBName,
       OBJECT_NAME(ind.object_id) AS TableName,
       ind.name AS IndexName,
       indexstats.index_type_desc AS IndexType,
       indexstats.avg_fragmentation_in_percent,
       indexstats.fragment_count,
       indexstats.avg_fragment_size_in_pages,
       SUM(p.rows) AS Rows 
  FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
         INNER JOIN sys.indexes AS ind ON (    ind.object_id = indexstats.object_id
                                           AND ind.index_id = indexstats.index_id)
         INNER JOIN sys.partitions AS p ON (    ind.object_id = p.object_id
                                            AND ind.index_id = p.index_id)
 WHERE indexstats.avg_fragmentation_in_percent > 30
 GROUP BY
       OBJECT_NAME(ind.object_id),
       ind.name,
       indexstats.index_type_desc,
       indexstats.avg_fragmentation_in_percent,
       indexstats.fragment_count,
       indexstats.avg_fragment_size_in_pages 
 ORDER BY indexstats.avg_fragmentation_in_percent DESC
8
amandamaddox3

Wann sollte ich Indizes neu erstellen?

Wenn der Prozentsatz der Indexfragmentierung mehr als 30% beträgt.

Gibt es Gründe, Indizes regelmäßig neu zu erstellen?

Es gibt keinen solchen Fall, aber im Allgemeinen ist es am besten, einmal pro Woche über das Wochenende eine Indexpflege durchzuführen, um die Umgebung stabil zu halten.

Ich würde empfehlen, Wartungsskripte von Ola Hallengren (beste Wartungsskripte) zu verwenden, die Skripte an Ihre Umgebung anzupassen und sie so zu planen, dass sie über das Wochenende ausgeführt werden.

https://ola.hallengren.com/

Hinweis: Bitte vergessen Sie nicht, die Statistiken nach dem Wiederherstellen von Indizes zu aktualisieren, da durch das Wiederherstellen von Indizes nicht alle Statistiken aktualisiert werden.

5
KrishnaV

Wie bei den meisten Dingen in der IT kommt es darauf an. Welches Problem versuchen Sie zu beheben, indem Sie Indizes neu erstellen? Können Sie zeigen, dass es das Problem tatsächlich behebt? Wenn ja, ändern Sie die Zahlen, bis Sie den geringsten Wartungsaufwand gefunden haben, den Sie zur Behebung des Problems benötigen.

Wenn das Problem dadurch nicht behoben wird oder der Grund, warum Sie dies tun, nur darin besteht, eine von Ihnen überwachte Metrik zu beschwichtigen, da dies die Dinge möglicherweise verbessern könnte, brennen Sie nur die CPU und IO = und möglicherweise Ihr Problem verschlimmern.

Es gibt ein Argument, dass das Beheben der Fragmentierung keinen Unterschied für Ihren Server macht. Lohnt es sich also, dies regelmäßig zu tun?

https://www.brentozar.com/archive/2017/12/index-maintenance-madness/

http://brentozar.com/go/defrag

1
Greg