Поделиться через


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

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

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

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

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

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

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

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

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

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

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

См. также:

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