Um die DB-Leistung zu maximieren, sollten diese Befehle ausgeführt werden, nachdem große Datenmengen über SSIS in SQL Server 2008 geladen wurden

11

Ich habe ein SSIS-Paket geschrieben, um Testdaten in eine leere Datenbank zu laden. Einige der Tabellen sind sehr groß (~ 700 Millionen Zeilen). Gibt es nach Abschluss des SSIS-Pakets Befehle, die ich ausführen sollte (als DBA-Lehrling!), Um die Leistung der Datenbank zu maximieren?

Zum Beispiel habe ich ausgeführt, EXEC sp_updatestatsaber es wurde berichtet, dass keine Indizes aktualisiert werden müssen.

Gibt es eine Liste der Dinge, die zu tun sind, wenn große Datenmengen geladen wurden, oder kümmert sich SQL Server 2008 nur um all das für Sie?

Mark Robinson
quelle

Antworten:

8

Wenn Sie in eine leere Datenbank laden, können / sollten Sie Maßnahmen ergreifen, um zu vermeiden, dass nach dem Laden zusätzliche Wartungsschritte erforderlich sind. Fragmentierung ist der Feind, das versuchen Sie zu vermeiden.

  • Löschen Sie alle NC-Indizes vor dem Laden.
  • Fügen Sie nach dem Laden die NC-Indizes für jede Tabelle nacheinander hinzu, dh fügen Sie keinen Index zu Tabelle A, dann zu Tabelle B und dann zurück zu Tabelle A hinzu. Dies hat keine Auswirkungen auf die Fragmentierung, kann jedoch die Zeit zum Hinzufügen der Indizes für sehr große Datasets verkürzen (verringert die Abwanderung von Pufferpools).
  • Wenn Sie Daten in Clustered-Index-Reihenfolge in eine Tabelle einfügen können, lassen Sie den Clustered-Index an Ort und Stelle. Wenn dies nicht möglich ist, speichern Sie die Daten auf einem Heap und erstellen Sie sie nach dem Laden in einem Clustered-Index neu.

Anstatt zu kopieren und einzufügen, verweise ich Sie auf die sehr umfassende Referenzliste für die ETL-Optimierung @Marian, die in einer Antwort auf eine Frage zusammengestellt wurde, die ich zu BCP gestellt habe . Viele davon sind gleichermaßen auf Ihr Szenario anwendbar.

Mark Storey-Smith
quelle
2
Interessanterweise wurde auf dem Link zu den Videos von SQLCAT und SSIS nie ein NC-Index gelöscht. Vermutlich ist dies ein weiterer Fall von "es kommt darauf an"
billinkc
2
@billinkc war das nicht für inkrementelle Ladevorgänge, sondern für die leere Datenbank, auf die sich diese Frage auch bezieht? In beiden Fällen handelt es sich bei SQLCAT-Tests in der Regel um eine Hardwareklasse, die in typischen Organisationen nur selten zu finden ist.
Mark Storey-Smith
5

Es hängt davon ab, wie viel Fenster Sie haben, aber im Allgemeinen ist es ein guter Schritt, Statistiken zu aktualisieren und Indizes neu zu erstellen / zu organisieren. Abgesehen davon sollte es nichts anderes geben, was Sie wirklich tun müssen.

Die Statistiken teilen dem Abfrageoptimierer mit, wie viele Zeilen wahrscheinlich von einer Operation betroffen sind, und geben wiederum an, mit welchem ​​Ansatz Ihre Abfragen ausgeführt werden sollen. Das Einfügen von Daten kann die Verteilung verzerren. Wenn Sie nicht genügend Zeilen eingefügt haben, um eine Aktualisierung der Statistiken im automatischen Aktualisierungsmodus auszulösen, sollte das manuelle helfen. Wenn Sie das Fenster haben, sage ich, behalten Sie den Statistik-Update-Teil.

Indizes können beim Hinzufügen von Daten fragmentiert werden. Durch die Neuerstellung oder Neuorganisation wird dies reduziert, was zu einer verbesserten Leistung beim tatsächlichen Zugriff auf Ihre Daten führen kann.

Mike Walsh
quelle
4
In Anlehnung an Indizes schlagen sie in einem der SSIS-Videos von SQLCAT auch eine Faustregel vor: Wenn Ihr Datenwachstum > 100% ist und es eine einzige NCI gibt, löschen Sie sie und erstellen Sie sie neu. Wenn es mehr als 10% beträgt und 2+ NCI vorhanden sind, führt Drop and Recreate zu einer besseren Leistung.
Billinkc
2
Nur um Bills Kommentar zu verdeutlichen - ich denke, er sagt, der Vorschlag ist, dass die Zeiten zum Erstellen von Drops den Index löschen, Ihre Daten laden und dann Ihren Index neu erstellen. Anstatt die Indizes während des Ladens dort zu belassen und danach wieder aufbauen. Ich denke schon :-) und ja, toller Punkt, ich +1 diesen Kommentar.
Mike Walsh