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?