Verwalten von Batchgrößen für das Massenkopieren
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz Azure Synapse Analytics Analytics 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 einer Massenkopie 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 Massenkopienvorgang in SQL Server den TABLOCK-Massenkopiehinweis 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 Massenkopien aus einer Datendatei wird die Batchgröße durch Aufrufen von bcp_control mit der Option BCPBATCH vor dem Aufrufen von bcp_exec angegeben. Beim Massenkopien von Programmvariablen mithilfe von bcp_bind und bcp_sendrow wird die Batchgröße durch Aufrufen bcp_batch nach dem Aufrufen bcp_sendrow x-Mal gesteuert, 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. Massenkopiefunktionen speichern die Zeilen normalerweise von bcp_sendrow zwischen, bis ein Netzwerkpaket gefüllt ist, und senden Dann das vollständige Paket an den Server. Wenn eine Anwendung jedoch bcp_batch aufruft, wird das aktuelle Paket 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. Beispielsweise bewirkt das Aufrufen von bcp_batch nach jedem bcp_sendrow , dass jede Zeile in einem separaten Paket gesendet wird und, es sei denn, die Zeilen sind sehr groß, 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 das attribut SQL_ATTR_PACKET_SIZE angibt.
Ein weiterer Nebeneffekt von Batches besteht darin, dass jeder Batch als herausragendes Resultset betrachtet wird, bis er mit bcp_batch abgeschlossen ist. Wenn andere Vorgänge für ein Verbindungshandle versucht werden, während ein Batch ausstehender Batch ist, gibt der ODBC-Treiber von SQL Server Native Client einen Fehler mit SQLState = "HY000" und eine Fehlermeldungszeichenfolge von:
"[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)