2010-06-11 24 views
7

Tengo una DataTable en memoria que necesito descargar directamente en una tabla temporal de SQL Server.¿Cuál es la manera más rápida de obtener una DataTable en SQL Server?

Después de insertar los datos, los transformo un poco, y luego inserto un subconjunto de esos registros en una tabla permanente.

La parte que consume más tiempo de esta operación es obtener los datos en la tabla temporal.

Ahora, tengo que usar tablas temporales, porque más de una copia de esta aplicación se está ejecutando a la vez, y necesito una capa de aislamiento hasta que la inserción real en la tabla permanente ocurra.

¿Cuál es la forma más rápida de hacer una inserción masiva desde una tabla de datos C# en una tabla de temperatura SQL?

No puedo utilizar herramientas de terceros para esto, ya que estoy transformando los datos en la memoria.

Mi método actual es crear un SqlCommand con parámetros:

INSERT INTO #table (col1, col2, ... col200) VALUES (@col1, @col2, ... @col200) 

y luego para cada fila, clara y establecer los parámetros y ejecutar.

Tiene que haber una manera más eficiente. Puedo leer y escribir los registros en el disco en cuestión de segundos ...

+0

¿Cuántas filas hay en el conjunto de datos? ¿Cuánto tiempo lleva insertar? – shahkalpesh

+0

200000 filas, más de 45 minutos. –

Respuesta

9

Debe usar SqlBulkCopy class.

+0

Impresionante, pero ¿sabes si se puede usar en tablas temporales? –

+0

@John Gietzen - la forma en que generalmente lo hago, es cargar en una mesa "real" - luego soltarlo una vez que haya terminado. – AdaTheDev

+0

Bueno, eso es algo factible, pero de nuevo hay alrededor de 10 copias de esta aplicación que podrían ejecutarse al mismo tiempo. ¿Sabes si una copia masiva puede ser parte de una transacción? –

9

SqlBulkCopy obtendrán los datos muy rápido.

I blogged not that long ago cómo maximizar el rendimiento. Algunas estadísticas y ejemplos allí. Comparé 2 técnicas, 1 con SqlDataAdapter y 1 con SqlBulkCopy: la línea inferior fue para insertar a granel 100K registros, el enfoque del adaptador de datos tomó ~ 25 segundos en comparación con solo ~ 0.8s para SqlBulkCopy.

+0

+1, pero estoy dando la aceptación a SLaks porque era más rápido. Gracias por el enlace. –

+0

Es rápido y preciso, como una bala de rifle de francotirador. –

Cuestiones relacionadas