Quelle est la meilleure façon d'utiliser SqlBulkCopy pour remplir un très grand tableau?

.net c# sqlbulkcopy sql-server vb.net

Question

Tous les soirs, je dois remplir une table SQL Server 2005 à partir d’une source ODBC contenant plus de 8 millions d’enregistrements. Actuellement, j'utilise une instruction insert d'un serveur lié avec une syntaxe similaire à celle-ci:

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

C'est vraiment inefficace et prend des heures à courir. Je suis en train de coder une solution à l'aide de code SqlBulkInsert similaire au code trouvé dans cette question .

Le code de cette question est tout d'abord en train de renseigner un objet datable en mémoire, puis de le transmettre à la méthode SqlBulkInserts WriteToServer.

Que dois-je faire si le serveur de données rempli utilise plus de mémoire que ce qui est disponible sur la machine sur laquelle il tourne (un serveur avec 16 Go de mémoire dans mon cas)?

J'ai envisagé d'utiliser la méthode de remplissage surchargée ODBCDataAdapter, qui vous permet de remplir uniquement les enregistrements de x à n (x étant l'index de départ et n le nombre d'enregistrements à remplir). Cependant, cela pourrait s'avérer être une solution encore plus lente que ce que j'ai actuellement, car cela impliquerait de réexécuter l'instruction select sur la source plusieurs fois.

Que devrais-je faire? Remplissez simplement le tout à la fois et laissez le système d'exploitation gérer la mémoire? Dois-je le peupler en morceaux? Y a-t-il une autre solution à laquelle je n'ai pas pensé?

Réponse acceptée

Le moyen le plus simple consiste à utiliser ExecuteReader () avec votre source de données odbc et à transmettre IDataReader à la surcharge WriteToServer (IDataReader) .

La plupart des implémentations de lecteurs de données ne conservent qu'une très petite partie du total des résultats en mémoire.


Réponse populaire

SSIS fonctionne bien et est très tweakable. D'après mon expérience, 8 millions de lignes ne sont pas en dehors de sa catégorie. L'un de mes plus grands ETL extrait 24 millions de lignes par jour et effectue des conversions majeures et des manipulations d'entrepôt de données dimensionnelles.



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