Quelle est la taille de lot recommandée pour SqlBulkCopy
? Je recherche une formule générale que je puisse utiliser comme point de départ pour l’ajustement des performances.
Réponses
Trop de publicités?J'ai un utilitaire d'importation assis sur le même serveur physique que mon instance de SQL Server. En utilisant une coutume IDataReader
, il analyse les fichiers plats et les insère dans une base de données à l'aide de SQLBulkCopy. Un fichier typique est d'environ 6M de lignes éligibles, avec une moyenne de 5 colonnes de décimales et de textes courts, d'environ 30 octets par ligne.
Compte tenu de ce scénario, j'ai trouvé un lot de 5000 à être le meilleur compromis de la vitesse et de la consommation de mémoire. J'ai commencé avec 500 et expérimenté avec les plus grands. J'ai trouvé 5000 à 2,5 x plus rapide, en moyenne, de 500. L'insertion de 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.
10000 était pas significativement plus rapide. Le déplacement jusqu'à 50000 amélioration de la vitesse de quelques points de pourcentage, mais ça ne vaut pas l'augmentation de la charge sur le serveur. Au-dessus de 50000 a montré aucune amélioration dans la vitesse.
Ce n'est pas une formule, mais c'est un autre point de données pour vous à utiliser.
C'est un problème que j'ai également passé du temps dans la recherche. Je suis à la recherche pour optimiser l'importation de gros fichiers CSV (16 GO, plus de 65 millions de disques, et la croissance) dans une base de données SQL Server 2005 à l'aide d'une application console C# (.Net 2.0). Que Jeremy a déjà souligné, vous aurez besoin de faire quelques modifications de votre situation particulière, mais je vous conseillerais d'avoir un premier lot de 500, et les valeurs d'essai à la fois au-dessus et au-dessous.
J'ai reçu la recommandation de tester des valeurs entre 100 et 1000 pour la taille des lots à partir de ce forum MSDN post, et était sceptique. Mais quand je l'ai testé pour des tailles de lots entre 100 et 10 000, j'ai trouvé que 500 est la valeur optimale pour mon application. La valeur de plus de 500 pour SqlBulkCopy.BatchSize
est également recommandé ici.
Pour optimiser encore plus votre SqlBulkCopy opération, visitez ce site MSDN conseils; je trouve que l'utilisation de SqlBulkCopyOptions.TableLock contribue à réduire le temps de chargement.
Comme d'autres l'ont dit, cela dépend de votre environnement spécialement la ligne du volume et de la latence du réseau.
Personnellement, j'aimerais commencer avec un réglage sur l' BatchSize
de la propriété de 1000 lignes et voir comment cela fonctionne. Si cela fonctionne, puis je continuer à doubler le nombre de lignes (par exemple à 2000, 4000, etc.) jusqu'à ce que je obtenir un délai d'attente.
Sinon, si un délai d'attente se produit à 1000, puis je baisse le nombre de lignes de moitié (par exemple, 500) jusqu'à ce que cela fonctionne.
Dans chaque cas, je continue à doubler (en cas de succès) ou la diminution de moitié (si échec), la différence entre chacune des deux dernières tentatives de tailles de lots en attendant de trouver un sweet spot.
L'autre facteur à considérer est combien de temps faut-il pour copier un seul lot de lignes. Délais d'attente va se produire si le lot de lignes copiées dépasse l' BulkCopyTimeout
des biens qui par défaut est de 30 secondes. Vous pouvez essayer de doubler l' BulkCopyTimeout
de la propriété à 60 secondes. Cela permet une plus longue période de temps pour un plus grand ensemble de lots de lignes à copier. Par exemple, un lot de 50 000 lignes peut prendre environ 40 secondes, à peine dépasser les 30 secondes limite de temps pour qu'il se cogner jusqu'à 60 secondes peut améliorer les performances.
Tout dépend de votre implémentation.
À quelle vitesse pouvez-vous vous attendre sur votre réseau? Est-ce que vous l'utilisez dans Forms ou ASP.Net? Avez-vous besoin d'alerter l'utilisateur des progrès? Quelle est la taille de l'emploi total?
Dans mon expérience, exécuter une copie en bloc sans taille de lot spécifiée causera des problèmes de dépassement de délai. J'aime commencer avec quelque chose comme 1000 disques et faire quelques ajustements à partir de là.