Paralleles Importieren von Daten mit Sperren auf Tabellenebene

MicrosoftSQL Server ermöglicht mehreren Clients das parallele Massenimportieren von Daten in eine nicht indizierte Tabelle. Dadurch kann die Leistung der Massenimportvorgänge verbessert werden. Das parallele Importieren von Daten wird von allen drei Massenimportbefehlen unterstützt: bcp, BULK INSERT und INSERT ... SELECT * FROM OPENROWSET(BULK...).

HinweisHinweis

Nur Anwendungen, die auf ODBC basierende bzw. auf SQL OLE DB basierende APIs verwenden, können parallele Datenladevorgänge in eine einzelne Tabelle ausführen. Keine der Anwendungen, darunter das Dienstprogramm bcp, die auf der mit MicrosoftSQL Server, Version 6.5, oder früher bereitgestellten DB-Library-Clientbibliothek basieren, kann an parallelen Datenladevorgängen in eine Instanz von SQL Server teilnehmen.

Wenn Sie die Option/den Hinweis TABLOCK nicht angeben, fordern mehrere parallele Massenimport-Datenströme Sperren mit einer Granularität unterhalb der Tabellenebene an. Je nach Verteilung der Daten können sich die parallelen Massenlade-Datenströme gegenseitig blockieren. Daher wird das parallele Massenimportieren von Daten in eine nicht indizierte Tabelle normalerweise mit TABLOCK ausgeführt.

Beachten Sie beim parallelen Massenimportieren von Daten in eine SQL Server-Instanz mithilfe von TABLOCK Folgendes:

  • Das einfachste Szenario für das parallele Importieren von Daten ist das Laden von Daten in eine nicht indizierte Tabelle (einen Heap).

  • Wenn die Tabelle keine Indizes enthält, geben Sie die Option TABLOCK für den Massenimportvorgang an. Weitere Informationen finden Sie unter Steuern des Sperrverhaltens für den Massenimport.

    HinweisHinweis

    Wenn in einer Tabelle Indizes vorhanden sind, können Sie keinen parallelen Ladevorgang mithilfe der Option TABLOCK ausführen. Zudem blockieren sich die gleichzeitigen Threads gegenseitig, wenn TABLOCK nicht angegeben ist. Vor einem Massenimportvorgang sollten Sie Indizes aus der Tabelle entfernen. Informationen zum Beibehalten oder Entfernen von Indizes finden Sie unter Richtlinien zur Optimierung von Massenimport.

  • Teilen Sie die zu importierenden Daten unter den Clients auf, indem Sie ebenso viele Datendateien wie Clients verwenden. Legen Sie auf jedem Client eine der Dateien ab.

    Bewährte Methode Sie sollten die Daten gleichmäßig zwischen den Clients verteilen, um den Prozessor so effizient wie möglich zu nutzen. Stellen Sie sicher, dass die Datendateien eine ähnliche Größe aufweisen, wenn Sie sie parallel von mehreren Clients in eine Instanz von SQL Server importieren möchten. Andernfalls wird ein Clientthread mit geringer Auslastung u. U. früher fertig gestellt, was zu einer ineffizienten Verwendung der CPU dieses Clients führt.

  • Um die maximale Leistung zu erzielen, sollte die Batchgröße, die für die einzelnen Clients angegeben wird, der Größe der Clientdatendatei entsprechen. Weitere Informationen finden Sie unter Verwalten von Batches für den Massenimport.

Nach dem Massenimportieren von Daten in die Tabelle können Sie die erforderlichen Indizes folgendermaßen erstellen:

  1. Erstellen Sie nacheinander alle gruppierten Indizes von einem Client. Weitere Informationen finden Sie unter Erstellen von gruppierten Indizes.

  2. Erstellen Sie die nicht gruppierten Indizes. Diese können gleichzeitig von unterschiedlichen Clients erstellt werden. Weitere Informationen finden Sie unter Erstellen nicht gruppierter Indizes.

Wenn Sie TABLOCK nicht angeben, können Sie das parallele Massenimportieren von Daten durchführen, und zwar unabhängig von der Anzahl der Indizes auf dem Ziel. In diesem Fall sind jedoch keine Massenoptimierungen möglich, und es können Blockierungen auftreten, wenn Sie Sperren auf einzelnen Zeilen oder Seiten erhalten.