Share via


Verwalten von Batchgrößen für das Massenkopieren

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Der Hauptzweck eines Batches in Massenkopiervorgängen besteht darin, den Umfang einer Transaktion zu definieren. Wenn keine Batchgröße festgelegt ist, wird der gesamte Massenkopiervorgang von den Massenkopierfunktionen als eine einzige Transaktion behandelt. Ist eine Batchgröße festgelegt, stellt jeder Batch eine Transaktion dar, für die nach Beendigung des Batches ein Commit ausgeführt wird.

Wenn ein Massenkopiervorgang ohne festgelegte Batchgröße ausgeführt wird und ein Fehler auftritt, wird für den gesamten Massenkopiervorgang ein Rollback durchgeführt. Das Wiederherstellen eines Massenkopiervorgangs mit langer Laufzeit kann einige Zeit in Anspruch nehmen. Wenn eine Batchgröße festgelegt wird, wird jeder Batch als Transaktion betrachtet und ein Commit für jeden Batch ausgeführt. Wenn ein Fehler auftritt, muss nur für den letzten ausstehenden Batch ein Rollback ausgeführt werden.

Die Batchgröße kann auch den Sperrenaufwand beeinflussen. Beim Ausführen eines Massenkopiervorgangs für SQL Server kann der TABLOCK-Hinweis mithilfe von bcp_control angegeben werden, um eine Tabellensperre anstelle von Zeilensperren abzurufen. Die einzelne Tabellensperre kann mit minimalem Aufwand für einen ganzen Massenkopiervorgang aufrechterhalten werden. Wird TABLOCK nicht festgelegt, werden Sperren für einzelne Zeilen errichtet und der Aufwand zur Aufrechterhaltung aller Sperren für die Dauer des Massenkopiervorgangs kann die Leistung beeinträchtigen. Da die Sperren nur für die Dauer der Transaktion aufrechterhalten werden, wird dieses Problem durch Angabe einer Batchgröße behoben, indem ein Commit ausgeführt wird, mit dem die aktuellen Sperren freigegeben werden.

Die Anzahl der Zeilen, die zu einem Batch gehören, kann sich erheblich auf die Leistung auswirken, wenn die Zeilenzahl für das Massenkopieren groß ist. Die Empfehlungen für die Batchgröße hängen vom Typ des auszuführenden Massenkopiervorgangs ab.

  • Geben Sie beim Massenkopiervorgang in SQL Server den TABLOCK-Massenkopierhinweis an, und legen Sie eine große Batchgröße fest.

  • Wenn TABLOCK nicht angegeben wird, beschränken Sie Batchgrößen auf unter 1.000 Zeilen.

Beim Massenkopiervorgang aus einer Datendatei wird die Batchgröße angegeben, indem bcp_control mit der Option BCPBATCH aufgerufen wird, bevor bcp_exec aufgerufen wird. Beim Massenkopiervorgang aus Programmvariablen mit bcp_bind und bcp_sendrow wird die Batchgröße gesteuert, indem bcp_batch aufgerufen wird, nachdem bcp_sendrowx-mal aufgerufen wurde, wobei x die Anzahl der Zeilen in einem Batch ist.

Batches sind nicht nur für das Festlegen der Größe einer Transaktion relevant, sondern wirken sich auch auf den Zeitpunkt aus, an dem Zeilen über das Netzwerk an den Server gesendet werden. Massenkopierfunktionen zwischenspeichern normalerweise die Zeilen aus bcp_sendrow , bis ein Netzwerkpaket gefüllt ist, und senden dann das vollständige Paket an den Server. Wenn eine Anwendung bcp_batch aufruft, wird das aktuelle Paket jedoch unabhängig davon, ob es ausgefüllt wurde, an den Server gesendet. Eine sehr niedrige Batchgröße kann die Leistung herabsetzen, wenn dadurch viele teilweise aufgefüllte Pakete an den Server gesendet werden. Wenn Sie beispielsweise bcp_batch nach jedem bcp_sendrow aufrufen, wird jede Zeile in einem separaten Paket gesendet, und, sofern die Zeilen nicht sehr groß sind, verschwendet Speicherplatz in jedem Paket. Die Standardgröße von Netzwerkpaketen für SQL Server beträgt 4 KB, obwohl eine Anwendung die Größe ändern kann, indem SQLSetConnectAttr aufgerufen wird, indem das attribut SQL_ATTR_PACKET_SIZE angegeben wird.

Ein weiterer Nebeneffekt von Batches ist, dass jeder Batch als ausstehendes Resultset betrachtet wird, bis er mit bcp_batch abgeschlossen ist. Wenn andere Vorgänge für ein Verbindungshandle versucht werden, während ein Batch aussteht, gibt der SQL Server Native Client ODBC-Treiber einen Fehler mit SQLState = "HY000" und eine Fehlermeldungszeichenfolge von aus:

"[Microsoft][SQL Server Native Client] Connection is busy with  
results for another hstmt."  

Weitere Informationen

Durchführen von Massenkopiervorgängen (ODBC)
Massenimport und -export von Daten (SQL Server)