Inserciones por lotes (Batch)


Es normal tener que hacer inserciones masivas de datos, para esto tenemos un sin fin de opciones que van desde el wizard de exportación e importación de SQL Server, SSIS, BCP, entre otras opciones, es también normal que se hagan estas inserciones en horarios no laborales, pero luego tenemos requerimientos que nos piden inserciones durante las horas laborales, esto puede llevar a bloqueos.

Para evitar o de menos reducir la cantidad de bloqueos y poder hacer inserciones lo mejor posible podemos hacer algo que se llama, inserción por lotes o batches, que no es nada más allá de hacer una inserción de valores por medio de grupos, digamos que tenemos un archivo de un millón y haremos las inserciones de 5,000 en 5,000.

Recuerden que como requerimiento ya debemos de tener la tabla que sera el destino del bulk insert.

Por linea de comando (2005 en adelante)

bcp testdb.dbo.pruebabcp in C:\test\test.csv -t, -c -T -b 5000

Con este pequeño código que debemos de correr desde la linea de comando logramos exportar el archivo que estoy añadiendo al final en grupos de 5,000 registros, sino pusiéramos el "-b 5000" que especifica un tamaño de lote de 5,000 usara el default de 1,000.

Si quisiéramos ejecutar el mismo desde sql server tendría que hacer also similar a:

USE master
GO
EXEC master.dbo.xp_cmdshell 'bcp test.dbo.prueba in C:\test.csv -t, -c -T -b 5000'

Que no es nada más que llamar la linea de comando desde el SQL Server Managment Studio.

Por codigo TSQL (2008 en adelante)

BULK INSERT
Test.dbo.prueba FROM 'C:\test.csv' with (BATCHSIZE = 5000, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')

Ambos resultaran en el resultado esperado

Archivo:
https://drive.google.com/open?id=0B2gfWYH7EFGcV29JTm85VDR3QU0

Más información:


Comentarios

Entradas más populares de este blog

Mover indices no clustered a un nuevo filegroup