Insertion en bloc parallèle avec SqlBulkCopy et Azure

azure azure-sql-database database parallel-processing sqlbulkcopy

Question

J'ai une application azur sur le cloud avec une base de données sql azure. J'ai un rôle de travailleur qui doit analyser et traiter un fichier (jusqu'à environ 30 millions de lignes), donc je ne peux pas utiliser directement BCP ou SSIS.

J'utilise actuellement SqlBulkCopy, mais cela semble trop lent, car j'ai constaté des temps de chargement allant jusqu'à 4-5 minutes pour 400 000 lignes.

Je veux exécuter mes inserts en vrac en parallèle; Cependant, en lisant les articles sur l'importation de données en parallèle / contrôlant le comportement du verrou, il indique que SqlBulkCopy nécessite que la table ne possède pas d'index en cluster et qu'un tablelock (verrou BU) doit être spécifié. Cependant, les tables azur doivent avoir un index clusterisé ...

Est-il même possible d'utiliser SqlBulkCopy en parallèle sur la même table dans SQL Azure? Sinon, existe-t-il une autre API (que je peux utiliser dans le code) pour le faire?

Réponse acceptée

Je ne vois pas comment vous pouvez courir plus vite que d'utiliser SqlBulkCopy. Sur notre projet, nous pouvons importer 250 000 lignes en environ 3 minutes, de sorte que votre taux semble à peu près correct.

Je ne pense pas que le faire en parallèle aiderait, même si c'était techniquement possible. Nous n'exécutons qu'une importation à la fois, sinon SQL Azure commence à limiter le délai de traitement de nos demandes.

En fait, parfois, exécuter une requête groupée importante en même temps que l'importation n'est pas possible. SQL Azure déploie beaucoup d'efforts pour garantir la qualité de service. Cela inclut le dépassement des demandes qui prennent trop de temps, de ressources, etc.

Donc, faire plusieurs gros encarts en même temps provoquera probablement un dépassement de temps.


Réponse populaire

Il est possible d'exécuter SQLBulkCopy en parallèle sur SQL Azure, même si vous chargez la même table. Vous devez préparer vous-même vos enregistrements par lots avant de les envoyer à l'API SQLBulkCopy. Cela vous aidera absolument à améliorer les performances et vous permettra de contrôler les opérations de nouvelle tentative pour un plus petit lot d'enregistrements lorsque vous serez limité pour des raisons autres que celles que vous réalisez.

Jetez un coup d'œil à mon article de blog en comparant les temps de chargement de différentes approches. Il y a aussi un exemple de code. Lors de tests séparés, j'ai pu réduire de moitié le temps de chargement d'une table.

C’est la technique que j’utilise pour quelques outils (Enzo Backup; Enzo Data Copy); Ce n'est pas une chose simple à faire, mais une fois terminé, vous pouvez optimiser considérablement les temps de chargement.



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