Gerenciando tamanhos de lote para cópia em massa

Aplica-se a: SQL Server (todas as versões com suporte) SQL do Azure Banco de Dados Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW)

A principal finalidade de um lote em operações de cópia em massa é definir o escopo de uma transação. Se o tamanho de um lote não for definido, as funções de cópia em massa irão considerar uma cópia em massa inteira como uma única transação. Se o tamanho do lote for definido, cada lote constituirá uma transação que será confirmada quando o lote terminar.

Se uma cópia em massa for executada sem tamanho de lote especificado e um erro for retornado, a cópia em massa inteira será revertida. A recuperação de uma cópia em massa longa pode levar muito tempo. Quando um tamanho de lote é definido, a cópia em massa considera cada lote uma transação e confirma cada lote. Se um erro for encontrado, apenas o último lote pendente precisará ser revertido.

O tamanho do lote também pode afetar a sobrecarga de bloqueios. Ao executar uma cópia em massa em SQL Server, a dica TABLOCK pode ser especificada usando bcp_control para adquirir um bloqueio de tabela em vez de bloqueios de linha. É possível manter um bloqueio de tabela com sobrecarga mínima para uma operação de cópia em massa inteira. Se TABLOCK não for especificada, os bloqueios serão mantidos em filas individuais e a sobrecarga da manutenção de todos os bloqueios durante a cópia em massa poderá prejudicar o desempenho. Pelo fato de os bloqueios só serem mantidos durante o tempo de uma transação, a especificação do tamanho de um lote trata esse problema gerando periodicamente uma confirmação que libera os bloqueios mantidos.

O número de linhas que compõem um lote pode ter efeitos significativos no desempenho quando a operação de cópia em massa é feita em um grande número de linhas. As recomendações de tamanho de lote dependem do tipo de cópia em massa que está sendo executada.

  • Ao copiar em massa para SQL Server, especifique a dica de cópia em massa TABLOCK e defina um tamanho de lote grande.

  • Quando TABLOCK não é especificada, limite os tamanhos de lote para menos de 1.000 linhas.

Ao copiar em massa de um arquivo de dados, o tamanho do lote é especificado chamando bcp_control com a opção BCPBATCH antes de chamar bcp_exec. Ao copiar em massa de variáveis de programa usando bcp_bind e bcp_sendrow, o tamanho do lote é controlado chamando bcp_batch depois de chamar bcp_sendrowx vezes, em que x é o número de linhas em um lote.

Além de especificar o tamanho de uma transação, os lotes também controlam quando serão enviadas linhas ao servidor através da rede. As funções de cópia em massa normalmente armazenam em cache as linhas de bcp_sendrow até que um pacote de rede seja preenchido e envie o pacote completo para o servidor. No entanto, quando um aplicativo chama bcp_batch, o pacote atual é enviado ao servidor, independentemente de ele ter sido preenchido. O uso de um tamanho de lote muito baixo pode prejudicar o desempenho se resultar no envio de muitos pacotes parcialmente preenchidos para o servidor. Por exemplo, chamar bcp_batch após cada bcp_sendrow faz com que cada linha seja enviada em um pacote separado e, a menos que as linhas sejam muito grandes, desperdiça espaço em cada pacote. O tamanho padrão dos pacotes de rede para SQL Server é de 4 KB, embora um aplicativo possa alterar o tamanho chamando SQLSetConnectAttr especificando o atributo SQL_ATTR_PACKET_SIZE.

Outro efeito colateral dos lotes é que cada lote é considerado um conjunto de resultados pendente até ser concluído com bcp_batch. Se outras operações forem tentadas em um identificador de conexão enquanto um lote estiver pendente, o driver ODBC SQL Server Native Client emitirá um erro com SQLState = "HY000" e uma cadeia de caracteres de mensagem de erro de:

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

Consulte Também

Executando operações de cópia em massa (ODBC)
Importação e exportação em massa de dados (SQL Server)