it-swarm.com.de

Leistungsoptimierung für SQL Server-Tabellen einfügen

Rahmen

In einem Datawarehouse füge ich eine Faktentabelle mit 20 Dimensionen hinzu. Die Faktentabelle enthält 32 Millionen Zeilen und 30 Spalten. Dies ist eine temporäre Staging-Tabelle, sodass ich mich nicht mit anderen Benutzern befassen muss, die in die Tabelle lesen oder schreiben. Ich wähle 10 Spalten aus der Basistabelle und 20 Spalten aus den jeweiligen Dimensionen aus. Die Dimensionstabellen sind klein (zwischen 3 und 15.000 Zeilen). Die Felder, auf denen verbunden werden, sind sowohl Ganzzahlen als auch nvarchars. Ich benutze eine SELECT ... INTO-Anweisung. Es gibt keine Indizes für die Tabellen.

Die Ausführungsgeschwindigkeit dieser Abfrage ist zu langsam, um nützlich zu sein.

Bewährte Lösungen

Da die Verarbeitung der Abfrage zu lange dauert, habe ich folgende Lösungen ausprobiert:

  1. Teilen Sie die 20 Joins in 4 Joins an 5 Tabellen auf. Die Abfrageleistung bleibt jedoch niedrig.
  2. Fügen Sie Indizes für die Fremdschlüsselspalten hinzu. Keine signifikante Zeitverkürzung.
  3. Stellen Sie sicher, dass die Felder der Verknüpfungsbedingung Ganzzahlen sind. Ich habe eine Leistungssteigerung von 25% festgestellt. Nicht ganz das, wonach ich suche.
  4. Verwenden Sie eine Einfügung in Anweisung anstelle von Auswahl in. Schlechtere Leistung aufgrund des Wachstums von Protokolldateien, obwohl sich die Datenbank im einfachen Wiederherstellungsmodus befindet.

Diese Ergebnisse führten mich dazu, den tatsächlichen Ausführungsplan aufzunehmen, der zeigt, dass 89% der Kosten in der Tabelleneinfügung liegen. Die anderen Kosten betragen 8% Tabellenscan in der Faktentabelle und 2% beim Hash-Matching für die inneren Verknüpfungen.

Fragen

  1. Was sind die möglichen Gründe für die langsame Tabelleneinfügung?
  2. Wie kann dieser Engpass ohne den Ausführungsplan identifiziert werden?
  3. Welche Maßnahmen kann ich ergreifen, um die Kosten für die Tabelleneinfügung zu senken?
8
Drizzt

Was sind die möglichen Gründe für die langsame Tabelleneinfügung? Wie kann dieser Engpass ohne den Ausführungsplan identifiziert werden?

Lesen Sie Analysieren der SQL Server-Leistung , insbesondere den Teil über Analysieren der Wartezeiten für die Ausführung einzelner Abfragen .

Welche Maßnahmen kann ich ergreifen, um die Kosten für die Tabelleneinfügung zu senken?

Dies würde weitgehend vom Ergebnis der Leistungsanalyse abhängen. Stellen Sie in erster Linie sicher, dass der Teil [~ # ~] select [~ # ~] so schnell wie möglich ist. Unter der Annahme, dass das Problem die vollständig protokollierte Ein-Thread-Einfügung ist, sind einige Lösungen:

12
Remus Rusanu

Unten ist meine Erfahrung und könnte anderen da draußen helfen.

Wir haben versucht, einige Daten von einer Datenbank in eine andere zu übertragen, und dabei auch einige Transformationen vorgenommen. Beim Testen der Transformation haben wir viele Einfügungen durchgeführt, Dinge auf dem Weg repariert und dann gelöscht, um die Einfügung erneut zu testen. Nach einigen Einfügungen und Kürzungen wurden unsere Abfragen jedoch langsam ausgeführt, und eine einfache Einfügung dauerte bis zu 9 Minuten, während sie zuvor etwa 3 Minuten lang ausgeführt wurde.

  1. Nun, wir haben zuerst angefangen, SELECTs zu optimieren. Anstelle von Unterabfragen haben wir #tempTables verwendet. Dies beschleunigte zwar die Dinge ein wenig, war aber immer noch nicht zufriedenstellend.
  2. Was den Unterschied ausmachte, war die Neuerstellung des Index und eine Aktualisierung der Statistiken in der Zieldatenbank, wodurch die Einfügung in etwa 2 Minuten erfolgte.

Probieren Sie diese beiden Strategien aus und sehen Sie, wie dies für Sie funktioniert.

1
Kleidi