Méthode recommandée pour importer un .fichier csv dans Microsoft SQL Server 2008 R2?
Quelle est votre méthode recommandée pour l'importation .les fichiers csv dans Microsoft SQL Server 2008 R2?
J'aimerais quelque chose de rapide, comme j'ai un répertoire avec beaucoup de .les fichiers csv (>500 MO répartis sur 500 .les fichiers csv).
Je suis à l'aide de SQL Server 2008 R2 sur Win 7 x64.
Mise À Jour: Solution
Voici comment j'ai résolu le problème de la fin:
- J'ai abandonné d'essayer d'utiliser LINQ to entities pour faire le travail. Il fonctionne, mais il ne prend pas en charge l'insertion en bloc, de sorte que ses propos 20x plus lent. Peut-être que la prochaine version de LINQ to entities permettra.
- Suivi les conseils donnés sur ce fil, utilisé bulk insert.
- J'ai créé une procédure stockée T-SQL qui utilise l'instruction bulk insert. Les données dans une table intermédiaire, est normalisé copiées dans la table cible.
- Je l'ai associé la procédure stockée en C# à l'aide de l'LINQ to entities cadre (il s'agit d'une vidéo sur www.learnvisualstudio.net montrant comment le faire).
- J'ai écrit tout le code pour faire défiler les fichiers, etc en C#.
- Cette méthode permet d'éliminer le goulet d'étranglement, qui est lu des tonnes de données à partir du lecteur et de l'insérer dans la base de données.
La raison pour laquelle cette méthode est très rapide à lire .les fichiers csv? Microsoft SQL Server arrive à importer les fichiers directement à partir du disque dur directement dans la base de données, à l'aide de son propre hautement optimisé routines. La plupart des autres C# en fonction des solutions nécessitent beaucoup plus de code, et certains (comme LINQ to entities) finissent par avoir à pipe les données lentement dans la base de données via le C#-SQL-server lien.
Oui, je sais qu'il serait plus agréable d'avoir 100% pure de code C# pour faire le travail, mais à la fin:
- (a) Pour ce problème particulier, à l'aide de T-SQL nécessite beaucoup moins de code par rapport à C#, environ 1/10e, en particulier pour la logique de dénormaliser les données de la table intermédiaire. C'est plus simple et plus facile à gérer.
- (b) à l'Aide de T-SQL signifie que vous pouvez profiter de la patrie, de l'instruction bulk insert procédures, ce qui accélère les choses à partir de 20 minutes d'attente pour un 30 secondes de pause.
OriginalL'auteur Contango | 2011-02-16
Vous devez vous connecter pour publier un commentaire.
À l'aide de l'instruction BULK INSERT dans un script T-SQL, semble être une bonne solution.
http://blog.sqlauthority.com/2008/02/06/sql-server-import-csv-file-into-sql-server-using-bulk-insert-load-comma-delimited-file-into-sql-server/
Vous pouvez obtenir la liste des fichiers dans votre répertoire avec xp_cmdshell et la commande dir (avec un peu de nettoyage). Dans le passé, j'ai essayé de faire quelque chose comme ça avec sp_OAMethod et fonctions VBScript et a dû utiliser la dir méthode parce que j'ai eu de la difficulté à obtenir la liste des fichiers avec l'OFS objet.
http://www.sqlusa.com/bestpractices2008/list-files-in-directory/
Ok, j'ai l'intention de faire la même chose et c'est très utile. Toutefois, puisque la procédure stockée peut être exécuter plusieurs fois en parallèle, je n'ai besoin bulk insert pour être fait au hasard mise en scène de la table(sens unique nom de la table à chaque fois), je vais faire le nettoyage de la table de transit une fois que le traitement est terminé.
OriginalL'auteur
Si vous avez rien à faire avec les données dans les fichiers autres que d'insérer, alors je vous recommande d'utiliser SSIS. Il peut non seulement d'insertion et/ou de mise à jour, il peut également nettoyer les données pour vous.
SSIS est de la merde, ne pas utiliser de SSIS. Pourquoi? Pas de tests unitaires, parfois, de se retrouver avec des doublons de la logique d'entreprise entre l'application et le package SSIS, etc coll. Utilisez uniquement SSIS si votre processus d'importation est simple, vous n'avez pas besoin de l'unité testsing, et aucune partie de il utilise une logique similaire pour le reste de votre application.
OriginalL'auteur
Officiellement pour la première prise en charge de l'importation de gros fichiers de texte est avec l'outil de ligne de commande appelé "bcp" (Utilitaire de Copie en bloc), très utile pour les énormes quantités de données binaires.
Veuillez consulter ce lien: http://msdn.microsoft.com/en-us/library/ms162802.aspx
Toutefois, dans SQL Server 2008 je présume que BULK INSERT commande devrait être votre choix numéro un, parce que, en premier lieu, il est devenu une partie de commande standard de l'ensemble. Si pour une raison quelconque, vous devez maintenir verticale de compatibilité, je collerais à l'utilitaire bcp, disponible pour SQL Server 2000.
HTH 🙂
ÉDITÉ plus TARD: Googler autour, j'ai rappelé que SQL Server 2000 avait BULK INSERT de commande trop... cependant, il y a évidemment une raison que j'ai ensuite collé jusqu'à bcp.exe et je ne me souviens plus pourquoi... peut-être de certaines limites, je suppose.
OriginalL'auteur
Je dois recommander ce:
OriginalL'auteur
Si la structure de l'ensemble de vos CSVs sont la même chose, je vous recommandons d'utiliser Integration Services (SSIS) pour la boucle entre eux et insérer tous dans la même table.
OriginalL'auteur
Je comprends que ce n'est pas exactement à votre question. Mais, si vous vous retrouvez dans une situation où vous utilisez un droit d'insérer utilisation tablock et insérer plusieurs lignes. Dépend de la taille de la ligne, mais je vont habituellement pour 600 à 800 lignes à la fois. Si c'est une charge dans une table vide, puis parfois la suppression des index et de la création d'eux après son chargement soit plus rapide. Si vous pouvez trier les données sur l'index cluster, avant de les charger. Utilisation IGNORE_CONSTRAINTS et IGNORE_TRIGGERS si vous le pouvez. Mettre la base de données en mode mono-utilisateur si vous le pouvez.
UTILISATION AdventureWorks2008R2;
ALLER
INSÉREZ DANS la Production.UnitMeasure avec (tablock)
Les VALEURS de (N'FT2', N'Square Pieds ', '20080923'), (N Y", N'Yards', '20080923'), (N'Y3', N'Cubic Mètres', '20080923');
ALLER
Éventuellement la table principale est active afin d'obtenir holdlock est difficile. Ce qui est sympa sur #temp tables est d'avoir un accès exclusif. La Table à la Table semble avoir une priorité plus élevée que d'une connexion externe. Je peux vous dire par expérience que le chargement triés par l'index cluster est majeure. Si je ne suis pas de tri à la source, je le charge dans un #de temp, donc je peux charger dans la "vraie" table triée par cluster de l'index. Mais nous ne sommes pas censés utiliser stackoverflow comme un fil de discussion.
OriginalL'auteur