Управление размером пакета массового копирования

Применимо к:SQL ServerAzure SQL DatabaseAzure Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Основным назначением пакета в операциях массового копирования является определение области транзакции. Если размер пакета не задан, то функции массового копирования рассматривают все массовое копирование как единую транзакцию. Если указан размер пакета, каждый пакет представляет собой транзакцию, которая фиксируется после завершения работы пакета.

Если при выполнении массового копирования размер пакета не указан и возникает ошибка, то происходит откат всего массового копирования. Восстановление массового копирования с продолжительным временем выполнения может занять значительное время. Если размер пакета задан, массовое копирование рассматривает каждый пакет как транзакцию и фиксирует каждый пакет. Если происходит ошибка, то необходим откат только одного последнего необработанного пакета.

Размер пакета может также влиять на затраты ресурсов, связанные с управлением блокировками. При выполнении массового копирования в SQL Server указание TABLOCK можно указать с помощью bcp_control для получения блокировки таблицы вместо блокировок строк. Минимальные издержки всей операции массового копирования может дать одна блокировка таблицы. Если подсказка TABLOCK не указана, выполняются блокировки для отдельных строк и издержки обслуживания всех блокировок во время массового копирования могут уменьшить производительность. Поскольку блокировки удерживаются только во время транзакции, указание размера пакета приводит к регулярному формированию фиксации, которая освобождает текущие блокировки.

Количество строк в пакете может значительно повлиять на производительность при массовом копировании большого числа строк. Рекомендуемый размер пакета зависит от типа выполняемого массового копирования.

  • При массовом копировании в SQL Server укажите указание массового копирования TABLOCK и задайте большой размер пакета.

  • Если подсказка TABLOCK не указана, ограничьте размер пакета числом менее 1000 строк.

При массовом копировании из файла данных размер пакета указывается путем вызова bcp_control с параметром BCPBATCH перед вызовом bcp_exec. При массовом копировании из переменных программы с помощью bcp_bind и bcp_sendrow размер пакета управляется вызовом bcp_batch после вызова bcp_sendrow x раз, где x — это количество строк в пакете.

Помимо указания размера транзакции, пакеты также оказывают влияние при отправке строк по сети серверу. Функции массового копирования обычно кэшируют строки из bcp_sendrow до заполнения сетевого пакета, а затем отправляют полный пакет на сервер. Однако когда приложение вызывает bcp_batch, текущий пакет отправляется на сервер независимо от того, был ли он заполнен. Использование очень маленького размера пакета может снизить производительность, если оно приведет к отправке на сервер большого числа частично заполненных пакетов. Например, вызов bcp_batch после каждого bcp_sendrow приводит к отправке каждой строки в отдельном пакете и, если строки не являются очень большими, объем места в каждом пакете не требуется. Размер сетевых пакетов по умолчанию для SQL Server составляет 4 КБ, хотя приложение может изменить размер, вызвав SQLSetConnectAttr , указав атрибут SQL_ATTR_PACKET_SIZE.

Другой побочный эффект пакетов заключается в том, что каждый пакет считается выдающимся результирующий набор, пока он не будет завершен с bcp_batch. Если при выполнении каких-либо других операций на дескриптор подключения выполняется, драйвер ODBC собственного клиента SQL Server выдает ошибку с SQLState = HY000 и строкой сообщения об ошибке:

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

См. также

Выполнение операций массового копирования (ODBC)
Массовый импорт и экспорт данных (SQL Server)