Copias masivas a base de datos en 0,

La clase SqlBulkCopy, introducida como novedad en el Framework 2.0, resulta de gran utilidad para realizar inserciones de datos masivas. En  pruebas realizadas de inserciones desde tablas en memoria a SqlServer 2005 con más de 10.000 registros el rendimiento es espectacular: pasa de tardar algo más de 12 segundos con un comando de inserción sqlcommand a menos de medio segundo con SqlBulkCopy. Por supuesto cuantos más datos incluya la inserción mayor es la diferencia. Es de destacar que incluso para una inserción unitaria esta clase es como mímino tan rápida como utilizar un sqlcommand de inserción. Así que no debemos preocuparnos de si perderemos rendimiento por tener pocos registros, o ganamos o nos quedamos igual.

En el siguiente código se muestra un ejemplo de volcado de una tabla existente en memoria llamada DataTableOrigen en una tabla en el servidor llamada TablaDestino.

El mapeo de columnas permite asignar las columnas de la tabla origen con sus correspondientes en la tabla destino. Una observación a tener en cuenta: el mapeado de columnas es sensible a mayúsculas.

 

Dim bulk As New SqlBulkCopy(MyConnectionString)

bulk.DestinationTableName = “TablaDestino”

bulk.ColumnMappings.Add(“Col1Origen”, “Col1Destino”)

bulk.ColumnMappings.Add(“Col2Origen “, “Col2Destino “)

bulk.ColumnMappings.Add(“Col3Origen “, “Col3Destino “)

 

bulk.WriteToServer(DataTableOrigen)

bulk.Close()

 

Podemos ajustar el tamaño de lote de inserción (mSqlBulkCopy.BatchSize) que trae por defecto. Las filas se enviarán al servidor en lotes de este número de filas. Eligiendo un tamaño adecuado se puede mejorar el rendimiento de la operación y se tiene un control más fino sobre las transacciones, que podemos definir para la operación entera o por lote.

Además se pueden controlar distintas configuraciones de copiado, como pueden ser si queremos deshabilitar los triggers que existieran en la tabla destino, bloquear la tabla, chequear Foreigs Keys…

Para más infomarmación sobre esta clase, podemos consultar la biblia.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *