.net définition - Quelle est la taille de lot recommandée pour SqlBulkCopy?




2 Answers

J'ai un utilitaire d'importation assis sur le même serveur physique que mon instance SQL Server. À l'aide d'un IDataReader personnalisé, il analyse les fichiers plats et les insère dans une base de données à l'aide de SQLBulkCopy . Un fichier typique a environ 6M lignes qualifiées, en moyenne 5 colonnes de texte décimal et court, environ 30 octets par ligne.

Compte tenu de ce scénario, j'ai trouvé une taille de lot de 5000 pour être le meilleur compromis de vitesse et de consommation de mémoire. J'ai commencé avec 500 et expérimenté avec plus grand. J'ai trouvé 5000 à 2.5x plus rapide, en moyenne, que 500. Insérer les 6 millions de lignes prend environ 30 secondes avec une taille de lot de 5000 et environ 80 secondes avec une taille de lot de 500.

10 000 n'étaient pas mesurables plus rapidement. Déplacer jusqu'à 50 000 a amélioré la vitesse de quelques points de pourcentage, mais cela ne vaut pas la charge accrue sur le serveur. Au-dessus de 50 000 n'a montré aucune amélioration de la vitesse.

Ce n'est pas une formule, mais c'est un autre point de données à utiliser.

quantité économique

Quelle est la taille de lot recommandée pour SqlBulkCopy ? Je cherche une formule générale que je peux utiliser comme point de départ pour l'optimisation des performances.




Comme d'autres l'ont indiqué, cela dépend de votre environnement, en particulier du volume des lignes et de la latence du réseau.

Personnellement, je commencerais par définir la propriété BatchSize sur 1000 lignes et voir comment cela fonctionne. Si cela fonctionne, je continue à doubler le nombre de lignes (par exemple à 2000, 4000, etc.) jusqu'à ce que je reçoive un délai.

Sinon, si un délai d'attente se produit à 1000, alors je diminue le nombre de lignes de moitié (par exemple 500) jusqu'à ce que cela fonctionne.

Dans chaque cas, je continue de doubler (en cas de succès) ou de réduire de moitié (en cas d'échec) la différence entre chacune des deux dernières tailles de lots tentées jusqu'à ce que l'on trouve un point d'intérêt.

L'autre facteur à prendre en compte est le temps nécessaire pour copier un seul lot de lignes. Des délais d'attente se produiront si le lot de lignes en cours de copie dépasse la propriété BulkCopyTimeout qui est par défaut de 30 secondes. Vous pouvez essayer de doubler la propriété BulkCopyTimeout à 60 secondes. Cela permet une plus longue période de temps pour qu'un plus grand nombre de lignes de lot soit copié. Par exemple, un lot de 50 000 lignes peut prendre environ 40 secondes, ce qui dépasse la limite de 30 secondes, ce qui peut aider à améliorer la performance.




Related