Ich versuche, eine Faktentabelle als Teil eines Gesamtleistungsprojekts zu beschleunigen. Der Tisch ist nur etwa 120 Millionen Zeilen, etwa 100k sind jeden Abend hinzugefügt. Der Tisch ist ziemlich stark indiziert.
Momentan verwende ich ein SSIS Fast Load OLE DB Ziel und das Laden der 100.000 Zeilen dauert ungefähr 15 Minuten. Das schien mir sehr hoch zu sein, um 100k Zeilen einzufügen, also änderte ich das Paket, um seine Ergebnisse in eine Zwischenspeichertabelle zu schreiben, und testete dann einen T-SQL aus dieser Zwischenspeichertabelle in die Faktentabelle. Die Einfügung läuft jetzt in weniger als 1 Minute.
Ich fand es ziemlich merkwürdig, dass eine einfache alte T-SQL-Einfügung schneller als SSIS Fast Load wäre, also habe ich angefangen zu schauen, welche Kästchen am OLEDB-Ziel überprüft wurden. Es stellt sich heraus, dass die Tabellensperre NICHT überprüft wurde. Wenn ich diese Option ankreuze, ist die SSIS-Last jetzt unter 1 Minute. Meine Fragen sind:
Nun, ich denke, die Erklärung ist einfach (siehe eine ausführlichere Referenz hier ):
Für Ihre erste Frage:
Table Lock - Standardmäßig ist diese Einstellung aktiviert und die Empfehlung ist es zu überprüfen, es sei denn, die gleiche Tabelle wird von einigen verwendet anderer Prozess zur gleichen Zeit. Es gibt an, dass eine Tabellensperre erworben wird in der Zieltabelle, anstatt mehrere Zeilen zu erfassen Sperren, die zu Lock-Eskalationsproblemen führen könnten.
Was die INSERT-Anweisung betrifft, so wird in Anbetracht der ziemlich großen Anzahl von Zeilen, die eingefügt werden müssen, SQL Server höchstwahrscheinlich eine Tabellensperre setzen.
Um dies zu bestätigen, können Sie überprüfen, welche Art von Sperren auf dem Tisch gehalten werden, indem Sie%% DM% verwenden. Hier sind ein paar gute Beispiele dafür, wie man die Ergebnisse interpretiert (und auch eine gute Leseleistung bei Lock-Eskalation): Ссылка .
Tags und Links sql-server-2008 ssis