Verwalten von Batchgrößen für das Massenkopieren
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 mit bcp_control festgelegt werden, um eine Tabellensperre statt 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.
Bei einem Massenkopiervorgang in SQL Server geben Sie den TABLOCK-Massenkopierhinweis an und legen eine große Batchgröße fest.
Wenn TABLOCK nicht angegeben wird, beschränken Sie Batchgrößen auf unter 1.000 Zeilen.
Beim Massenkopieren aus einer Datendatei wird die Batchgröße festgelegt, indem bcp_control mit der BCPBATCH-Option vor dem Aufrufen von bcp_exec aufgerufen wird. Beim Massenkopieren aus Programmvariablen mit bcp_bind und bcp_sendrow wird die Batchgröße durch Aufrufen von bcp_batch gesteuert, nachdem bcp_sendrow x-Mal aufgerufen wurde, wobei x der Anzahl der Zeilen in einem Batch entspricht.
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. Mit den Massenkopierfunktionen werden die Zeilen aus bcp_sendrow normalerweise zwischengespeichert, bis ein Netzwerkpaket aufgefüllt ist. Anschließend wird das volle Paket an den Server gesendet. Wenn eine Anwendung bcp_batch aufruft, wird das aktuelle Paket an den Server gesendet unabhängig davon, ob es aufgefüllt wurde. Eine sehr niedrige Batchgröße kann die Leistung herabsetzen, wenn dadurch viele teilweise aufgefüllte Pakete an den Server gesendet werden. Das Aufrufen von bcp_batch nach jedem bcp_sendrow-Aufruf führt beispielsweise dazu, dass jede Zeile in einem einzelnen Paket gesendet wird und, falls die Zeile nicht äußerst groß ist, in jedem Paket Platz verschenkt wird. Die Standardgröße von Netzwerkpaketen für SQL Server beträgt 4 KB. Eine Anwendung kann die Größe jedoch durch Aufrufen von SQLSetConnectAttr und Angeben des SQL_ATTR_PACKET_SIZE-Attributs ändern.
Ein anderer Nebeneffekt von Batches besteht darin, dass jeder Batch als ausstehendes Resultset betrachtet wird, bis er mit bcp_batch abgeschlossen wird. Wenn für ein Verbindungshandle Vorgänge ausgeführt werden, während ein Batch aussteht, gibt der SQL Server Native Client ODBC-Treiber einen Fehler mit SQLState = "HY000" und folgender Fehlermeldungszeichenfolge aus:
"[Microsoft][SQL Server Native Client] Connection is busy with
results for another hstmt."