Was ist schneller für Millionen von Datensätzen: Permanente Tabelle oder Temp Tabellen?
Ich muss es nur für 15 Millionen Datensätze verwenden. Nachdem die Verarbeitung abgeschlossen ist, löschen wir diese Datensätze.
In Ihrer Situation verwenden wir eine permanente Tabelle, die Staging-Tabelle genannt wird. Dies ist eine gängige Methode bei großen Importen. Tatsächlich verwenden wir im Allgemeinen zwei Zwischenspeichertabellen, eine mit den Rohdaten und eine mit den bereinigten Daten, was die Suche nach Problemen mit dem Feed einfacher macht (sie sind fast immer das Ergebnis neuer und vielfältiger Möglichkeiten unserer Kunden, uns Daten zu schicken) das müssen wir beweisen können). Außerdem vermeidet man Probleme wie die temporäre Datenbank zu vergrößern oder Probleme für andere Benutzer zu verursachen, die temporäre Datenbank benutzen wollen, aber warten müssen, während sie für Sie wächst, usw.
Sie können auch SSIS verwenden und die Staging-Tabelle (n) überspringen, aber ich finde die Möglichkeit, zurückzugehen und zu recherchieren, ohne eine 50.000.000 Tabelle neu laden zu müssen, ist sehr hilfreich.
Wenn Sie tempdb nicht verwenden, stellen Sie sicher, dass das Wiederherstellungsmodell der Datenbank, in der Sie arbeiten, nicht auf "Full" eingestellt ist. Dies verursacht eine Menge Overhead für diese 50M-Zeileneinsätze.
Idealerweise sollten Sie, sofern möglich, eine Staging-Datenbank, ein einfaches Wiederherstellungsmodell, auf RAID 10 verwenden und die Größe im Voraus festlegen, um genügend Speicherplatz für alle Ihre Vorgänge bereitzustellen. Deaktivieren Sie das automatische Wachstum.
Verwenden Sie INSERT ... WITH (TABLOCK), um die Protokollierung auf Zeilenebene zu vermeiden:
%Vor%Gleiches gilt für BULK INSERT. Wenn Sie die Datei löschen und neu erstellen, erstellen Sie den Clustered-Index prior zum Einfügen. Wenn dies nicht möglich ist, fügen Sie sie zuerst in eine Tabelle ein, fügen Sie sie dann in eine andere Tabelle mit der richtigen Clusterbildung ein und schneiden Sie die erste Tabelle ab. Vermeiden Sie, wenn möglich, kleine Losgrößen auf BULK INSERT. Lesen Sie die BULK INSERT-Dokumentation aufmerksam, da Sie die Leistung mit den falschen Optionen sabotieren können.
Vermeiden Sie INSERT ... EXEC. Jede Zeile wird protokolliert.
Vermeiden Sie UPDATEs, es sei denn, Sie müssen laufende Summen berechnen. Im Allgemeinen ist es günstiger, eine Tabelle in eine andere Tabelle einzufügen und dann die erste Tabelle zu kürzen, als sie vor Ort zu aktualisieren. Laufende Summenberechnungen sind die Ausnahme, da sie mit einem UPDATE und Variablen durchgeführt werden können, um Werte zwischen Zeilen zu sammeln.
Vermeiden Sie Tabellenvariablen für alles außer Kontrollstrukturen, da sie die Parallelisierung verhindern. Verbinden Sie Ihre 50M-Zeilentabelle nicht mit einer Tabellenvariablen, sondern verwenden Sie stattdessen eine temporäre Tabelle.
Haben Sie keine Angst vor Cursorn für die Iteration. Verwenden Sie Cursorvariablen, und deklarieren Sie sie mit dem STATIC-Schlüsselwort für Spalten mit niedriger Kardinalität an der Vorderseite des gruppierten Index. Verwenden Sie diese Option, um große Tabellen in verwaltbare Abschnitte zu zerlegen.
Versuchen Sie nicht, in einer Aussage zu viel zu tun.
Die permanente Tabelle ist schneller, wenn die Tabellenstruktur zu 100% identisch sein soll, da kein Overhead für die Zuweisung von Speicherplatz und das Erstellen der Tabelle besteht.
Die Temp-Tabelle ist in bestimmten Fällen schneller (z. B. wenn Sie keine Indizes benötigen, die auf der permanenten Tabelle vorhanden sind und die Einfügungen / Aktualisierungen verlangsamen würden)
Permanente Tabelle ist in den meisten Fällen schneller als temporäre Tabelle.
Sehen Sie sich Ссылка
anTemporäre Tabellen sind im Speicher (außer sie sind zu groß), also sollten sie theoretisch sehr schnell sein. Aber es ist normalerweise nicht. Als Faustregel versuchen Sie, sich von temporären Tabellen fernzuhalten, es sei denn, dies ist die einzige Lösung. Kannst du uns etwas mehr darüber sagen, was du versuchst? Es könnte wahrscheinlich mit einer abgeleiteten Abfrage
getan werdenTags und Links sql sql-server sql-server-2008 tsql