¿MySqlDataAdapter o MySqlDataReader para transferencia masiva?

mysql sqlbulkcopy sql-server

Pregunta

Estoy usando el conector MySql para .NET para copiar datos de los servidores MySql a SQL Server 2008.

¿Alguien ha experimentado un mejor rendimiento utilizando uno de los siguientes, en comparación con el otro?

  • DataAdapter y llamando a Fill to a DataTable en partes de 500
  • DataReader.Leer a una tabla de datos en un bucle de 500

Luego estoy usando SqlBulkCopy para cargar las 500 filas de DataTable, luego continúo en bucle hasta que el conjunto de registros de MySql se transfiera completamente.

Me preocupa principalmente usar una cantidad razonable de memoria y completar en un corto período de tiempo.

¡Cualquier ayuda sería apreciada!

Respuesta aceptada

He usado SqlBulkCopy con DataReader al procesar grandes cantidades de datos. He encontrado que el proceso es bastante eficiente en términos de velocidad y uso de memoria, ya que todo el conjunto de datos no se recupera antes de copiar. Recomiendo establecer la propiedad BatchSize a un valor razonable, digamos 500 en su caso.


Respuesta popular

No he usado SqlBulkCopy, pero como regla general, los DataReaders suelen ofrecer un mejor rendimiento.

Se puede procesar un DataReader mientras la consulta subyacente sigue devolviendo registros (por lo que no tiene que esperar a que la consulta finalice antes de poder comenzar a procesar los datos). Un DataReader devolverá los datos en cuanto esté disponible y creo que solo almacenará el registro activo en la memoria de forma predeterminada (no el conjunto de resultados completo), lo que reducirá el uso de la memoria.

Un DataAdapter carga el conjunto de resultados completo en un DataTable / DataSet que tendrá una mayor sobrecarga debido a la forma en que la información se almacena en la memoria y el estado asociado adicional (piense en el estado de las filas, etc.).

Si solo estoy leyendo datos, siempre usaré un DataReader sobre un DataAdapter ... ¿alguien me corrige si me equivoco en algún punto?

En cualquier caso, parece que SqlBulkCopy solo itera sobre los registros y no usa DataTable para ninguna optimización (según Reflector), por lo que creo que DataReader es su mejor opción.



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é