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?
quelle
Antworten:
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:
DISABLE
Nicht gruppierte Indizes, wobei der gruppierte Index intakt bleibtREBUILD
NC-IndizesWenn 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).
quelle
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:
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.
quelle
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.Lesen Sie mehr über Fragmentierung
Sie wollen wieder aufbauen (nicht fallen lassen / recreate) Indizes , wenn die Fragmentierung „zu hoch“
Ich habe den IndexOptimize-Prozess in diesem Paket , der jede Nacht ausgeführt werden soll.
quelle