Insertion de masse dans le serveur SQL
Je suis tenté d'insérer une masse de documents dans SQL Server 2005 à partir de Vb.Net. Bien que l'insertion fonctionne très bien, je fais de mon mieux pour essayer de le rendre aussi vite que possible. Actuellement, il faut ~ 11 minutes pour 100 000 entrées. Quelle serait l'approche suggérée pour l'insertion d'un grand nombre d'enregistrements dans SQL Server à partir d'une Application?
Mon apporach est essentiellement l'ouverture de la connexion, le parcours de ma liste d'informations et de tir sur sql insert relevés, et la fermeture de la connexion. Quelqu'un a une meilleure suggestion sur la façon de faire cela?
Fonction Actuelle:
Public Sub BatchInsert(ByVal ParamCollections As List(Of SqlParameter()))
Dim Conn As SqlConnection = New SqlConnection(DBHelper.DatabaseConnection)
Using scope As TransactionScope = New TransactionScope()
Using Conn
Dim cmd As SqlCommand = New SqlCommand("sproc_name", Conn)
Conn.Open()
cmd.CommandType = CommandType.StoredProcedure
For i = 0 To ParamCollections.Count - 1
cmd.Parameters.Clear()
cmd.Parameters.AddRange(ParamCollections(i))
cmd.ExecuteNonQuery()
Next
Conn.Close()
scope.Complete()
End Using
End Using
End Sub
source d'informationauteur Nathan
Vous devez vous connecter pour publier un commentaire.
Utiliser le SqlBulkCopy classe, il sera en mesure d'exécuter par le biais de ces 100K lignes beaucoup plus rapide que l'individu s'insère.
Oh, et si vous le pouvez, je vous demande instamment de mettre en œuvre un IDataReader capable de classe, afin de nourrir les SqlBulkCopy.WriteToServer(IDataReader) méthode, ce qui vous permettra de produire des données de manière séquentielle, une ligne à la fois. Si vous importez à partir d'un fichier texte, comme un exemple, la construction de certains
IEnumerable<T>
méthodes qui utiliseyield return
et de le convertir en un IDataReader objet vous permettra d'envoyer des données vers le serveur très naturellement.Pour contrer la perte de la restauration de la capacité de BCP, vous pouvez transférer les données dans une table temporaire, et ensuite exécuter normal
INSERT INTO
déclarations sur le serveur par la suite, en vrac-le transfert des données de la table temporaire dans la production de la table, ce qui vous permettra d'utiliser une transaction pour le dernier transfert de la partie, et continue à fonctionner beaucoup plus rapide que l'original de votre personne insert.EDIT: et Voici un exemple (C#, mais il devrait être facile de les convertir à VB.Net) de l'utilisation de la majeure partie de la charge de l'API.
Grâce à l'aide de chacun, j'ai pu remplir ma tâche. Le SQLBulkCopy l'adapter à mes besoins à la perfection (même si il y a d'autres excellentes suggestions). À l'aide de SqlBulkcopy,le temps est passé de 11 minutes et 45 secondes. Je ne peux pas croire la différence!
Référence pour l'avenir, voici quelques bits d'information:
Mise en Œuvre de base code:
Très instructif lien que j'ai trouvé:
À L'Aide De Sql Copie En Bloc
Merci à tous pour l'aide! J'apprécie sincèrement.
Mettre vos données à importer dans un fichier csv et exécutez l'utilitaire bcp sur les données. Vous ne pouvez pas obtenir plus rapidement avec séquentielle des appels d'insérer des lignes simples, à un moment, vous avez certainement besoin d'un bloc d'utilité si vous voulez de la performance.
La SQLBulkCopy cours vous permettra de vous transmettre toutes les données dans une collection de sorte que le serveur peut traiter tout à la fois, l'élimination de l'arrière-et-vient. Donc, si vous voulez éviter de créer des fichiers temporaires (dont je), puis regardez à la classe.
Juste avoir la connexion reste ouverte est un bon début, mais vous avez encore la surcharge de l'envoi d'une rangée, ayant SQL magasin, retourner un résultat, et ensuite, vous devez effectuer une itération à la ligne suivante.
voici un peu de vitesse pour la comparaison des différentes méthodes d'importer des fichiers texte dans sql server:
http://weblogs.sqlteam.com/mladenp/archive/2006/07/22/10742.aspx
espère que cela aide.
Il y a aussi une procédure stockée (appelé Bulk Insert) qui va faire l'affaire pour vous.. Il utilise bcp de sous les couvertures.
consultez ce lien pour voir la syntaxe
texte du lien
Il dépend de la façon dont la copie en bloc de la classe est mise en œuvre. Mais il y a un outil en ligne de commande inclus avec l'installation de SQL Server qui fait exactement cela (c'est probablement le même). Il est appelé "bcp". Je l'utilise en ce moment et il devrait être en mesure de tempête à travers 100k lignes dans une affaire de secondes.
Documentation MSDN se réfère à elle comme "l'importation en bloc" de l'utilitaire.