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:
- Teilen Sie die 20 Joins in 4 Joins an 5 Tabellen auf. Die Abfrageleistung bleibt jedoch niedrig.
- Fügen Sie Indizes für die Fremdschlüsselspalten hinzu. Keine signifikante Zeitverkürzung.
- Stellen Sie sicher, dass die Felder der Verknüpfungsbedingung Ganzzahlen sind. Ich habe eine Leistungssteigerung von 25% festgestellt. Nicht ganz das, wonach ich suche.
- 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, aus dem hervorgeht, dass 89% der Kosten in der Tabelleneinlage liegen . Die anderen Kosten betragen 8% Tabellenscan in der Faktentabelle und 2% beim Hash-Matching für die inneren Verknüpfungen.
Fragen
- Was sind die möglichen Gründe für die langsame Tabelleneinfügung?
- Wie kann dieser Engpass ohne den Ausführungsplan identifiziert werden?
- Welche Maßnahmen kann ich ergreifen, um die Kosten für die Tabelleneinfügung zu senken?
quelle
Antworten:
Lesen Sie, wie Sie die SQL Server-Leistung analysieren , insbesondere den Teil zum Analysieren der Wartezeiten für die Ausführung einzelner Abfragen .
Dies würde weitgehend vom Ergebnis der Leistungsanalyse abhängen. Stellen Sie in erster Linie sicher, dass der SELECT- Teil 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:
Verwenden Sie den Partitionsschalter, um die Daten zu verschieben. Dies ist bei weitem die beste Lösung. Bereiten Sie die Staging-Daten in einer separaten Staging-Tabelle vor und wechseln Sie diese Staging-Tabelle in die DW-Tabelle. Effizientes Lesen der Datenübertragung mithilfe der Partitionsumschaltung .
Stellen Sie sicher, dass das INSERT minimal protokolliert ist. Lesen Sie Vorgänge, die minimal protokolliert werden können, und die Voraussetzungen für eine minimale Protokollierung . Auch wenn Sie Partitionswechseloperationen verwenden, sollten Sie sicherstellen, dass der Build der Staging-Tabelle nur minimal protokolliert wird.
Stellen Sie sicher, dass Ihr E / A-Subsystem eine schnelle Last antreiben kann. Lesen Sie Einführung in SSDs .
quelle
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.
Probieren Sie diese beiden Strategien aus und sehen Sie, wie dies für Sie funktioniert.
quelle