Wann sollten Indizes gelöscht und neu erstellt werden?

9

Wir bauen ein Data Warehouse auf, das zunächst 1 TB groß sein wird und jeden Monat um etwa 20 GB wachsen wird.

Für bestimmte Tabellen führen wir tägliche ETL-Prozesse durch, für andere wöchentlich / monatlich.

Wenn ein Datenimport in eine Tabelle ausgeführt wird, müssen die Indizes gelöscht und neu erstellt werden?

Gibt es jemals einen Grund, Indizes zu löschen und neu zu erstellen, oder werden sie automatisch aktualisiert?

Die Statistiken werden so eingestellt, dass sie automatisch aktualisiert werden.

Vielen Dank für Ihre Hilfe und Anleitung.

Ich habe dieses geniale Drehbuch:

SELECT 'ALTER INDEX [' + ix.name + '] ON [' + s.name + '].[' + t.name + '] ' +
       CASE WHEN ps.avg_fragmentation_in_percent > 40 THEN 'REBUILD' ELSE 'REORGANIZE' END +
       CASE WHEN pc.partition_count > 1 THEN ' PARTITION = ' + cast(ps.partition_number as nvarchar(max)) ELSE '' END
FROM   sys.indexes AS ix INNER JOIN sys.tables t
           ON t.object_id = ix.object_id
       INNER JOIN sys.schemas s
           ON t.schema_id = s.schema_id
       INNER JOIN (SELECT object_id, index_id, avg_fragmentation_in_percent, partition_number
                   FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL)) ps
           ON t.object_id = ps.object_id AND ix.index_id = ps.index_id
       INNER JOIN (SELECT object_id, index_id, COUNT(DISTINCT partition_number) AS partition_count
                   FROM sys.partitions
                   GROUP BY object_id, index_id) pc
           ON t.object_id = pc.object_id AND ix.index_id = pc.index_id
WHERE  ps.avg_fragmentation_in_percent > 10 AND
       ix.name IS NOT NULL

von hier:

http://weblogs.asp.net/okloeten/archive/2009/01/05/6819737.aspx

Schlagen Sie vor, dass ich dieses Skript täglich ausführe und basierend auf den Ergebnissen den generierten Code ausführe?

l - '' '' '-' '' '' '' '' '' '' '
quelle
Ich wäre Ihnen sehr dankbar , wenn mir jemand erklären , was das Problem mit meiner Frage ist
l --''''''--------- ‚‘ ‚‘ ‚‘ ‚‘ ‚‘ ‚‘
Hier ist eine verwandte Frage, die ich gestellt habe. dba.stackexchange.com/questions/11389/… Das Wissen, das ich aus dieser Frage und den Antworten gewonnen habe, hat mich viel gelehrt und wir haben dadurch große Gewinne erzielt.
Swasheck

Antworten:

13

Wenn dies eine zyklische ETL ist und Sie sich in einer Entwicklungsdatenumgebung (dh NICHT LIVE) befinden, sollten Sie Ihre Indizes auf jeden Fall als Teil Ihres Ladezyklus verwalten.

Ich mache das jeden Monat für mehrere Datensätze, von denen der größte einem 5-TB-Datensatz monatlich etwa 100 GB hinzufügt.

Ich habe umfangreiche Tests durchgeführt und aus eigener Erfahrung ist der effizienteste Weg zum Laden in Bezug auf Indizes:

  1. DISABLE Nicht gruppierte Indizes, wobei der gruppierte Index intakt bleibt
  2. Laden Sie Raw in Ihre Datentabelle
  3. REBUILD NC-Indizes

Wenn Sie Zeilen nur regelmäßig als Teil der verwalteten ETL hinzufügen, ist dies der richtige Weg. Dies stellt auch sicher, dass alle Ihre Statistiken auf dem neuesten Stand sind.

Bei Statistiken ist zu beachten, dass das Hinzufügen von 20 GB zu einer 1-TB-Datenbank nicht den Wendepunkt für eine automatische Aktualisierung der Statistiken erreicht. Sie können also einen ganzen Monat Daten hinzufügen, ohne jemals Statistiken zu aktualisieren.

Die Neuerstellung Ihrer NC-Indizes ist ein guter Weg, um dies zu umgehen. Möglicherweise möchten Sie auch regelmäßig eine Clustered-Index-Neuerstellung durchführen, wenn die Fragmentierung hoch wird (abhängig von Ihrer Tabellenstruktur und Ihrem Clustered-Schlüssel).

JNK
quelle
4
Sie können Statistiken auch als separaten Teil Ihres Prozesses aktualisieren, der zwischen NC-Neuerstellungen gemischt wird, wenn dies häufig zu teuer ist.
Aaron Bertrand
1

Bei einer Datenbank mit mehr als 1 TB wäre das tägliche Löschen und Erstellen von Indizes zu viel des Guten (selbst wenn Sie nur einige davon neu erstellen).

Wenn Sie sich aufgrund des durch Indexaktualisierungen verursachten Overheads Sorgen über die Einfüge- / Aktualisierungsgeschwindigkeit in Ihrer Tabelle machen, empfehle ich zwei Dinge:

  1. Verwenden Sie Ersatz-PKs, damit Clustered-Index-Einfügungen nur einen minimalen Overhead haben.
  2. Profilieren Sie Ihren DWH und erstellen Sie nicht gruppierte Indizes, wo dies unbedingt erforderlich ist.

Während der Einfüge- / Aktualisierungsvorgänge müssen Sie mit nicht gruppierten Indexaktualisierungen leben.

Wenn Sie sich Sorgen über die Indexfragmentierung machen, empfehle ich, tägliche Jobs (SQL Agent-Jobs) für die Neuerstellung der Indizes zu erstellen. Die Wiederherstellungsperiode kann tatsächlich alles sein, abhängig von der Fragmentierungsstufe. Sie sollten dies in der Praxis beachten und den Jobplan entsprechend einrichten.

Abhängig von der Fragmentierungsstufe können Sie den Wiederherstellungsskripten eine Logik hinzufügen. Einige gute Richtlinien finden Sie hier .

Unter dem Strich sollten Sie unter keinen Umständen eine vollständige Indexwiederherstellung für eine Datenbank dieser Größe durchführen.

Marcel N.
quelle
6
Ich muss mit vielem nicht einverstanden sein. Es wird von seinem Anwendungsfall abhängen, aber diese letzte Zeile under any circumstances you shouldn't do a full index rebuild on a database of that size.ist überhaupt nicht korrekt. Ich mache ETL in sehr großen Datenbanken als meine Hauptaufgabe und sehe große Vorteile darin, Indizes zu deaktivieren und neu zu erstellen.
JNK
1
Ich wünschte, dies würde auch in meinem Fall zutreffen. In einer Datenbank mit etwas mehr als 1 TB, die in einer Produktionsumgebung ausgeführt wird, kann ich es mir kaum leisten, eine nächtliche, nicht gruppierte Indexwiederherstellung für mehrere Tabellen mit mehr als 500 Mio. zu durchführen. Reihen. Ich habe mehrere ETL-Prozesse, die jede Nacht ausgeführt werden, und der letzte Schritt, den ich ab 3:00 Uhr mache, besteht darin, Indizes neu zu erstellen.
Marcel N.