¿Cuáles son los inconvenientes de insertar millones de registros en SQL Server desde un archivo plano?

StackOverflow https://stackoverflow.com/questions/141556

Pregunta

Estoy a punto de comenzar un viaje escribiendo una aplicación de formularios de Windows que abrirá un archivo txt que está delimitado por tuberías y tiene un tamaño de unos 230 mb. Esta aplicación luego insertará estos datos en una base de datos de SQL Server 2005 (obviamente esto debe suceder rápidamente). Estoy usando c # 3.0 y .net 3.5 para este proyecto.

No estoy pidiendo la aplicación, solo algunos consejos comunes aquí y posibles errores. Desde el sitio he recopilado que la copia masiva de SQL es un requisito previo, ¿hay algo en lo que deba pensar (creo que abrir el archivo txt con una aplicación de formularios será un gran esfuerzo; tal vez dividirlo en datos de blob?).

Gracias, y editaré la pregunta para mayor claridad si alguien la necesita.

¿Fue útil?

Solución

¿Tienes que escribir una aplicación de winforms? Podría ser mucho más fácil y rápido utilizar SSIS. Hay algunas tareas integradas disponibles, especialmente Tarea de inserción masiva .

También vale la pena revisar Los métodos de importación masiva de archivos sin formato comparan la velocidad en SQL Server 2005.

Actualización: si eres nuevo en SSIS, revisa algunos de estos sitios para ponerte en la vía rápida. 1) Aspectos básicos del flujo de control de SSIS 2) Introducción a SQL Server Integration Services

Este es otro Cómo: en importando un archivo de Excel a SQL 2005 .

Otros consejos

Esto va a ser un esfuerzo de transmisión.

Si puedes, no uses transacciones aquí. El costo transaccional simplemente será demasiado alto.

Entonces, lo que vas a hacer es leer el archivo una línea a la vez e insertarlo en una línea a la vez. Debería volcar las inserciones fallidas en otro archivo que pueda diagnosticar más tarde y ver dónde fallaron.

Al principio, seguiría adelante y probaría una inserción masiva de un par de cientos de filas solo para ver si la transmisión funciona correctamente y luego puedes abrir todo lo que quieras.

Puede intentar usar SqlBulkCopy . Te permite extraer de " cualquier fuente de datos " ;.

Como una nota al margen, a veces es más rápido eliminar los índices de su tabla y volver a crearlos después de la operación de inserción masiva.

Puede considerar cambiar de recuperación completa a registro masivo. Esto ayudará a mantener sus copias de seguridad de un tamaño razonable.

Recomiendo totalmente SSIS, puedes leer millones de registros y limpiarlos en el tiempo en relativamente poco tiempo.

Necesitará dedicar un tiempo para familiarizarse con SSIS, pero debería ser recompensado. Hay algunos otros hilos aquí en SO que probablemente serán útiles:

¿Cuál es la forma más rápida de insertar una gran cantidad de datos en SQL Server (cliente C #)

¿Cuáles son los materiales de aprendizaje recomendados para SSIS?

También puede crear un paquete desde C #. Tengo un programa C # que lee un archivo maestro de 3GL " " " de un sistema heredado (analiza en un modelo de objeto usando una API que tengo para un proyecto relacionado), toma una plantilla de paquete y la modifica para generar un paquete para el ETL.

El tamaño de los datos de los que estás hablando en realidad no es tan gigantesco. No sé cuáles son sus preocupaciones de eficiencia, pero si puede esperar algunas horas para que se inserte, le sorprenderá lo fácil que sería lograrlo con una técnica realmente ingenua de INSERTAR cada fila una a la vez. . Agrupar por lotes un millar de filas a la vez y enviarlas al servidor SQL también puede hacer que sea un poco más rápido.

Solo una sugerencia que podría ahorrarle mucho tiempo de programación, si no necesita que sea tan rápido como sea posible. Dependiendo de la frecuencia con la que se ejecute esta importación, ahorrar unos pocos días de tiempo de programación podría valer la pena a cambio de esperar unas pocas horas mientras se ejecuta.

Podría usar SSIS para la lectura & amp; inserte, pero llámelo como un paquete desde su aplicación WinForms. Luego podría pasar cosas como origen, destino, cadenas de conexión, etc. como parámetros / configuraciones.

Cómo: http://msdn.microsoft.com/en-us /library/aa337077.aspx

Puede configurar transformaciones y manejo de errores dentro de SSIS e incluso crear bifurcaciones lógicas basadas en parámetros de entrada.

Si el formato de columna del archivo coincide con la tabla de destino donde deben terminar los datos, prefiero usar la utilidad de línea de comandos bcp para cargar el archivo de datos. Es increíblemente rápido y puede especificar un archivo de error para cualquier " impd " registros que no se pueden insertar.

Su aplicación podría iniciar el comando si necesita almacenar los parámetros de la línea de comandos (servidor, base de datos, nombre de usuario / contraseña o conexión confiable, tabla, archivo de error, etc.).

Me gusta este método mejor que ejecutar un comando BULK INSERT SQL porque no se requiere que el archivo de datos esté en un sistema al que pueda acceder el servidor de la base de datos. Para usar la inserción masiva, debe especificar la ruta de acceso al archivo de datos para que se cargue, por lo que debe ser una ruta visible y legible para el usuario del sistema en el servidor de base de datos que ejecuta la carga. Demasiado molestia para mí por lo general. :-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top