Administrar tamaños de lote de copia masiva

Se aplica a: síSQL Server (todas las versiones admitidas) SíAzure SQL Database SíInstancia administrada de Azure SQL síAzure Synapse Analytics síAlmacenamiento de datos paralelos

El propósito principal de un lote en las operaciones de copia masiva consiste en definir el ámbito de una transacción. Si no se establece un tamaño de lote, las funciones de copia masiva consideran una copia masiva completa como una transacción. Si se establece un tamaño de lote, cada lote constituye una transacción que confirma cuando finaliza el lote.

Si una copia masiva se realiza sin especificar ningún tamaño de lote y se produce un error, se revierte la copia masiva completa. La recuperación de una copia masiva de ejecución prolongada puede tardar mucho tiempo. Cuando se establece un tamaño de lote, la copia masiva considera cada lote como una transacción y confirma cada lote. Si se produce un error, solo es necesario revertir el último lote pendiente.

El tamaño de lote también puede afectar a la sobrecarga de bloqueo. Al realizar una copia masiva en , la sugerencia TABLOCK se puede especificar mediante bcp_control para adquirir un bloqueo de tabla en lugar de SQL Server bloqueos de fila. El bloqueo de una única tabla se puede mantener con una sobrecarga mínima en una operación de copia masiva completa. Si no se especifica TABLOCK, los bloqueos se mantienen en las filas individuales y la sobrecarga de mantener todos los bloqueos durante la copia masiva puede reducir el rendimiento. Dado que los bloqueos solo se mantienen mientras dura una transacción, la especificación de un tamaño del lote resuelve este problema ya que se genera periódicamente una confirmación que libera los bloqueos actuales.

El número de filas que conforman un lote puede tener efectos significativos en el rendimiento cuando se realiza la copia masiva de un gran número de filas. Las recomendaciones para el tamaño del lote dependen del tipo de copia masiva que se realiza.

  • Cuando realice una copia masiva en SQL Server, especifique la sugerencia TABLOCK de copia masiva y establezca un tamaño de lote grande.

  • Si no especifica TABLOCK, limite los tamaños de lote a un número menor que 1.000 filas.

Al realizar la copia masiva desde un archivo de datos, el tamaño del lote se especifica llamando a bcp_control con la opción BCPBATCH antes de llamar a bcp_exec. Al copiar de forma masiva desde variables de programa mediante bcp_bind y bcp_sendrow, el tamaño del lote se controla mediante una llamada a bcp_batch después de llamar bcp_sendrow x veces, donde x es el número de filas de un lote.

Además de especificar el tamaño de una transacción, los lotes también afectan al envío de las filas al servidor a través de la red. Las funciones de copia masiva suelen almacenar en caché las filas bcp_sendrow hasta que se rellena un paquete de red y, a continuación, enviar el paquete completo al servidor. Sin embargo, cuando una bcp_batch llama a , el paquete actual se envía al servidor independientemente de si se ha rellenado. La utilización de un tamaño de lote muy bajo puede reducir el rendimiento si da lugar al envío de numerosos paquetes parcialmente rellenados al servidor. Por ejemplo, llamar a bcp_batch después de cada bcp_sendrow hace que cada fila se envíe en un paquete independiente y, a menos que las filas sean muy grandes, desperdicia espacio en cada paquete. El tamaño predeterminado de los paquetes de red para SQL Server es de 4 KB, aunque una aplicación puede cambiar el tamaño llamando a SQLSetConnectAttr especificando el SQL_ATTR_PACKET_SIZE predeterminado.

Otro efecto secundario de los lotes es que cada lote se considera un conjunto de resultados pendiente hasta que se completa bcp_batch. Si se intenta realizar cualquier otra operación en un identificador de conexión mientras hay un lote pendiente, el controlador ODBC de Native Client emite un error con SQLState = "HY000" y una cadena de mensaje de SQL Server error de:

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

Consulte también

Realizar operaciones de copia masiva (odbc)
Importar y exportar datos en bloque (SQL Server)