¿Cuál es la forma más rápida de exportar una tabla a un archivo de texto?


17

Tendré una base de datos SQL Server 2012 y una tabla con 3 millones de filas y quizás 50 columnas. ¿Cuál será la forma más rápida para que un proceso .net en segundo plano desatendido (tal vez emita algún comando SQL o Powershell) para exportarlo a un archivo de texto, una línea para cada fila de datos? El proceso .net debe saber cuándo finalizó la exportación o si hubo algún error. El tipo de datos será todo into nvarchar.

Supongo que un código C # puro que usa ado.net para ejecutar un select *comando y recorrer el lector de datos y escribir en un archivo para cada registro será lento y no hay forma de que pueda paralelizar esto.

Idealmente, la exportación será a una carpeta de red compartida remota y no a una carpeta local en la máquina de SQL Server. El servidor SQL será un clúster HA. ¿SSIS es más adecuado para esto, no se requiere transformación de datos?

El proceso .Net se ejecutaría en la Máquina A, SQL Server en la Máquina B y el destino final del archivo es un recurso compartido de red. Una opción es que el servidor SQL escribe el archivo directamente en el recurso compartido de red. La otra opción es que SQL Server escribe en la máquina A y luego, cuando se escribe el archivo, el proceso .net lo copia al recurso compartido de red. No tengo SLA formal pero espero 30 minutos - 1 hora para la escritura del archivo.


3
"Ideally the export will be to a remote shared network folder and not a local folder on the SQL Server machine."- ¿desde dónde se ejecutará la aplicación .NET? En el peor de los casos, esto podría significar que los datos deben moverse a través de 2 saltos de red, lo que probablemente será el mayor cuello de botella. Además, el número de filas es algo irrelevante: ¿cuál es el tamaño total aproximado de los datos? ¿Tiene un SLA de rendimiento que necesita cumplir para este proceso?
Jon Seigel

Respuestas:


10

Recorrer todos esos artículos es una opción si quieres envejecer viéndolo ejecutar.

Algunas opciones diferentes que debe probar son:

Y puede probar todas estas opciones mientras se repite en otra sesión, solo por diversión :-).


4

Simplemente usaría el Asistente de importación y exportación. Al final, tiene la opción de guardar la tarea, que luego puede programar con el Agente SQL Server. Agréguese como operador y configure DB Mail en el servidor, y puede enviarle un correo electrónico cuando el trabajo se complete o falle.

En serio, ¿por qué reinventar la rueda?

http://msdn.microsoft.com/en-us/library/ms140052.aspx


No está nada mal, en realidad esto guarda un paquete SSIS al final. Si es una tarea única, puede ser una solución.
Marian

2

Otros han declarado que bcp debería ser la forma más rápida, pero no veo ninguna ventaja sobre una solución CLR. En las inserciones en las tablas de la base de datos, las diversas implementaciones de copia masiva siempre ganarán. Esto se debe principalmente a la forma en que minimizan el registro y habilitan las escrituras multiproceso. No tiene estas restricciones al escribir en un archivo plano.

En mi trabajo, usamos un CLR para volcar la salida de la consulta a un archivo. También incorporamos el archivo Ionic.Zip.dll para que el archivo se pueda comprimir automáticamente después de la creación.

Aquí hay un ejemplo que la operación dice ser el doble de rápido que bcp en blobs: /programming/10325338/fastest-way-to-export-blobs-from-table-into-individual-files


Esa pregunta en particular no es muy detallada. Le sugiero que lea la siguiente pregunta: Optimización del rendimiento de BCP para datos BLOB aquí. Seguramente te dará una idea sobre las muchas opciones de juego que tienes solo con BCP :-).
Marian

Veo los enlaces y estoy totalmente de acuerdo. Pero la mayoría de los puntos de optimización son para cargar datos en el servidor SQL. Todavía no he visto ningún hecho relacionado con bcp que sea más rápido que una solución CLR de streamwriter o filestream cuando escribo datos SQL en un archivo plano.
Brian

1

Puede crear un paquete SSIS simple:

Aquí hay un alto nivel de cómo:

  1. Cree una conexión OLEDB a la base de datos en el administrador de conexión
  2. Arrastre una Transformación de flujo de datos al Control Flow y luego haga clic en ella para acceder al flujo de datos.
  3. Arrastre un origen OLEDB desde la caja de herramientas al flujo de datos y edítelo para que se conecte a la tabla deseada utilizando la conexión que creó en el paso 1
  4. Arrastre un Destino de archivo plano desde la caja de herramientas al flujo de datos y conéctelo a la fuente OLEDB.
  5. Seleccione "Nuevo" en el Destino de archivo plano, y creará un nuevo archivo plano con la misma estructura de columnas, y puede usar su delimitador deseado, o tal vez un archivo fijo con el archivo si lo desea.
  6. Ejecutarlo.

Cualquier novato debería ser capaz de resolver esto. A una persona Anti-GUI no le gustaría esta solución, así que guarde los comentarios al respecto, es solo una alternativa para las personas menos expertas en tecnología que luchan con BCP ...

Tiene un poco más de flexibilidad en cómo se formatea el archivo de datos. Puede hacer esto en BCP y todo eso, pero esto le quita la complejidad. Pero existe una pequeña ventaja, ya que puede colocar un encabezado de archivo personalizado y crear un "Nombre de columna" como la primera fila, lo que hace que el archivo plano sea más consumible para los humanos.

¡No olvide guardarlo, si lo creó una vez, es probable que se le vuelva a preguntar! Espero que esto ayude..


0

Creo que bcp.exe desde la línea de comandos debería ser la forma más rápida.

http://msdn.microsoft.com/en-us/library/ms162802.aspx


55
Si bien puede tener razón, ¿podría arrojar algo de luz sobre los detalles sobre esta solución? Cómo se utiliza (un enlace a los documentos puede ser suficiente), ¿por qué cree que es el más rápido, etc.
Dezso
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.