MySqlDataAdapter ou MySqlDataReader pour le transfert de masse?

mysql sqlbulkcopy sql-server

Question

J'utilise le connecteur MySql pour .NET pour copier des données de serveurs MySql vers SQL Server 2008.

Quelqu'un a-t-il connu de meilleures performances en utilisant l'un des éléments suivants, par rapport à l'autre?

  • DataAdapter et appelant Fill à un DataTable en morceaux de 500
  • DataReader.Read à un DataTable dans une boucle de 500

J'utilise alors SqlBulkCopy pour charger les 500 lignes DataTable, puis continue en boucle jusqu'à ce que le jeu d'enregistrements MySql soit complètement transféré.

Je suis principalement préoccupé par l’utilisation d’une quantité de mémoire raisonnable et l’achèvement rapide du projet.

Toute aide serait appréciée!

Réponse acceptée

J'ai utilisé SqlBulkCopy avec DataReader lors du traitement de grandes quantités de données. J'ai trouvé le processus assez efficace en termes de rapidité et d'utilisation de la mémoire, car l'ensemble des données n'est pas récupéré avant la copie. Je vous recommande de définir la propriété BatchSize sur une valeur raisonnable, par exemple 500 dans votre cas.


Réponse populaire

Je n'ai pas utilisé SqlBulkCopy, mais en règle générale, les DataReaders offrent généralement de meilleures performances.

Un DataReader peut être traité pendant que la requête sous-jacente renvoie toujours des enregistrements (vous n'avez donc pas à attendre que la requête se termine avant de pouvoir commencer à traiter les données). Un DataReader renverra des données dès qu'elles seront disponibles et je crois que ne stockera que l'enregistrement actif en mémoire par défaut (pas l'ensemble de résultats complet), réduisant ainsi l'utilisation de la mémoire.

Un DataAdapter charge le jeu de résultats complet dans un DataTable / DataSet dont la surcharge est plus importante en raison de la manière dont les informations sont stockées dans la mémoire et de l'état associé supplémentaire (think rowstate, etc.).

Si je ne lis que des données, j'utiliserai toujours un DataReader sur un DataAdapter ... s'il vous plaît, corrigez-moi si je me trompe à un moment ou à un autre?

Quoi qu'il en soit, SqlBulkCopy semble ne parcourir que les enregistrements et n'utilise pas le DataTable pour aucune optimisation (selon Reflector). Je pense donc que DataReader est votre meilleur pari.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi