Управление размером пакета массового копированияManaging Bulk Copy Batch Sizes

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance даAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics даПараллельное хранилище данныхParallel Data WarehouseyesПараллельное хранилище данныхParallel Data WarehouseПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance даAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics даПараллельное хранилище данныхParallel Data WarehouseyesПараллельное хранилище данныхParallel Data Warehouse

Основным назначением пакета в операциях массового копирования является определение области транзакции.The primary purpose of a batch in bulk copy operations is to define the scope of a transaction. Если размер пакета не задан, то функции массового копирования рассматривают все массовое копирование как единую транзакцию.If a batch size is not set, then bulk copy functions consider an entire bulk copy to be one transaction. Если указан размер пакета, каждый пакет представляет собой транзакцию, которая фиксируется после завершения работы пакета.If a batch size is set, then each batch constitutes a transaction that is committed when the batch finishes.

Если при выполнении массового копирования размер пакета не указан и возникает ошибка, то происходит откат всего массового копирования.If a bulk copy is performed with no batch size specified and an error is encountered, the entire bulk copy is rolled back. Восстановление массового копирования с продолжительным временем выполнения может занять значительное время.The recovery of a long-running bulk copy can take a long time. Если размер пакета задан, массовое копирование рассматривает каждый пакет как транзакцию и фиксирует каждый пакет.When a batch size is set, bulk copy considers each batch a transaction and commits each batch. Если происходит ошибка, то необходим откат только одного последнего необработанного пакета.If an error is encountered, only the last outstanding batch needs to be rolled back.

Размер пакета может также влиять на затраты ресурсов, связанные с управлением блокировками.The batch size can also affect locking overhead. При выполнении операции с массовым копированием SQL ServerSQL Server Указание TABLOCK можно указать с помощью bcp_control , чтобы получить блокировку таблицы вместо блокировки строк.When performing a bulk copy against SQL ServerSQL Server, the TABLOCK hint can be specified using bcp_control to acquire a table lock instead of row locks. Минимальные издержки всей операции массового копирования может дать одна блокировка таблицы.The single table lock can be held with minimal overhead for an entire bulk copy operation. Если подсказка TABLOCK не указана, выполняются блокировки для отдельных строк и издержки обслуживания всех блокировок во время массового копирования могут уменьшить производительность.If TABLOCK is not specified then locks are held on individual rows and the overhead of maintaining all the locks for the duration of the bulk copy can slow performance. Поскольку блокировки удерживаются только во время транзакции, указание размера пакета приводит к регулярному формированию фиксации, которая освобождает текущие блокировки.Because locks are only held for the length of a transaction, specifying a batch size addresses this problem by periodically generating a commit that frees the locks currently held.

Количество строк в пакете может значительно повлиять на производительность при массовом копировании большого числа строк.The number of rows making up a batch can have significant performance effects when bulk copying a large number of rows. Рекомендуемый размер пакета зависит от типа выполняемого массового копирования.The recommendations for batch size depend on the type of bulk copy being performed.

  • При массовом копировании в SQL ServerSQL Server укажите подсказку TABLOCK и задайте большой размер пакета.When bulk copying to SQL ServerSQL Server, specify the TABLOCK bulk copy hint and set a large batch size.

  • Если подсказка TABLOCK не указана, ограничьте размер пакета числом менее 1000 строк.When TABLOCK is not specified, limit batch sizes to less than 1,000 rows.

При выполнении операции с массовым копированием из файла данных размер пакета указывается путем вызова bcp_control с параметром бкпбатч перед вызовом bcp_exec.When bulk copying in from a data file, the batch size is specified by calling bcp_control with the BCPBATCH option before calling bcp_exec. При выполнении операций с массовым копированием из переменных программы с помощью bcp_bind и bcp_sendrowразмер пакета контролируется путем вызова bcp_batch после вызова bcp_sendrow x раз, где x — число строк в пакете.When bulk copying from program variables using bcp_bind and bcp_sendrow, the batch size is controlled by calling bcp_batch after calling bcp_sendrow x times, where x is the number of rows in a batch.

Помимо указания размера транзакции, пакеты также оказывают влияние при отправке строк по сети серверу.In addition to specifying the size of a transaction, batches also affect when rows are sent across the network to the server. Функции с массовым копированием обычно кэшируют строки из bcp_sendrow до тех пор, пока не будет заполнен сетевой пакет, а затем отправит полный пакет на сервер.Bulk copy functions normally cache the rows from bcp_sendrow until a network packet is filled, and then send the full packet to the server. Однако когда приложение вызывает bcp_batch, текущий пакет отправляется на сервер независимо от того, был ли он заполнен.When an application calls bcp_batch, however, the current packet is sent to the server regardless of whether it has been filled. Использование очень маленького размера пакета может снизить производительность, если оно приведет к отправке на сервер большого числа частично заполненных пакетов.Using a very low batch size can slow performance if it results in sending many partially filled packets to the server. Например, вызов bcp_batch после каждой bcp_sendrow вызывает отправку каждой строки в отдельном пакете и, если строки не слишком велики, занимают место в каждом пакете.For example, calling bcp_batch after every bcp_sendrow causes each row to be sent in a separate packet and, unless the rows are very large, wastes space in each packet. По умолчанию размер сетевых пакетов для SQL Server составляет 4 КБ, хотя приложение может изменить размер, вызвав SQLSetConnectAttr , указав атрибут SQL_ATTR_PACKET_SIZE.The default size of network packets for SQL Server is 4 KB, although an application can change the size by calling SQLSetConnectAttr specifying the SQL_ATTR_PACKET_SIZE attribute.

Другой побочный результат пакетов состоит в том, что каждый пакет считается необработанным результирующим набором до тех пор, пока не завершится с помощью bcp_batch.Another side effect of batches is that each batch is considered an outstanding result set until it is completed with bcp_batch. При попытке выполнить какие-либо другие операции с помощью обработчика соединения, когда пакет недоступен, SQL ServerSQL Server драйвер ODBC для собственного клиента выдает ошибку с SQLState = "HY000" и строку сообщения об ошибке:If any other operations are attempted on a connection handle while a batch is outstanding, the SQL ServerSQL Server Native Client ODBC driver issues an error with SQLState = "HY000" and an error message string of:

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

См. такжеSee Also

Выполнение операций с массовым копированием (ODBC) Performing Bulk Copy Operations (ODBC)
Массовый импорт и экспорт данных (SQL Server)Bulk Import and Export of Data (SQL Server)