¿Cuál es la mejor manera de usar SqlBulkCopy para llenar una tabla realmente grande?

.net c# sqlbulkcopy sql-server vb.net

Pregunta

Cada noche, necesito llenar una tabla de SQL Server 2005 de una fuente ODBC con más de 8 millones de registros. Actualmente estoy usando una declaración de inserción del servidor vinculado con una selección de sintaxis similar a esta:

Insert Into SQLStagingTable from Select * from OpenQuery(ODBCSource, 'Select * from SourceTable')

Esto es realmente ineficiente y toma horas para ejecutarse. Estoy en medio de codificar una solución usando el código SqlBulkInsert similar al código encontrado en esta pregunta .

El código en esa pregunta es primero llenar una base de datos en la memoria y luego pasarla al método SqlBulkInserts WriteToServer.

¿Qué debo hacer si la fuente de datos poblada usa más memoria de la que está disponible en la máquina que está ejecutando (un servidor con 16 GB de memoria en mi caso)?

He pensado en usar el método de llenado ODBCDataAdapter sobrecargado que le permite llenar solo los registros de x a n (donde x es el índice de inicio y n es el número de registros que se deben completar). Sin embargo, podría ser una solución aún más lenta que la que tengo actualmente, ya que significaría volver a ejecutar la declaración de selección en la fuente varias veces.

¿Que debería hacer? ¿Simplemente rellena todo de una vez y deja que el sistema operativo administre la memoria? ¿Debo poblarlo en trozos? ¿Hay alguna otra solución que no haya pensado?

Respuesta aceptada

La forma más fácil sería usar ExecuteReader () contra su fuente de datos odbc y pasar el IDataReader a la sobrecarga de WriteToServer (IDataReader) .

La mayoría de las implementaciones de lectores de datos solo mantendrán una pequeña parte de los resultados totales en la memoria.


Respuesta popular

SSIS se desempeña bien y es muy modificable. En mi experiencia 8 millones de filas no está fuera de su liga. Uno de mis ETL más grandes acumula 24 millones de filas al día y realiza grandes conversiones y manipulaciones de almacenes de datos dimensionales.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué