Quels sont les pièges de l'insertion de millions d'enregistrements dans SQL Server à partir d'un fichier à plat?

StackOverflow https://stackoverflow.com/questions/141556

Question

Je suis sur le point de commencer un voyage en écrivant une application Windows Forms qui ouvrira un fichier txt délimité par des tubes de 230 mb environ. Cette application insérera ensuite ces données dans une base de données SQL Server 2005 (évidemment, cela doit se faire rapidement). J'utilise c # 3.0 et .net 3.5 pour ce projet.

Je ne demande pas l'application, mais juste quelques conseils communaux et des pièges potentiels. D'après le site Web, la copie groupée SQL est une condition préalable, y a-t-il une chose à laquelle je devrais penser (je pense que le simple fait d'ouvrir le fichier txt avec une application de formulaire sera une entreprise de grande envergure; peut-être le diviser en données blob?).

Merci et je modifierai la question pour plus de clarté si quelqu'un en a besoin.

Était-ce utile?

La solution

Devez-vous écrire une application Winforms? Il serait peut-être beaucoup plus facile et rapide d’utiliser SSIS. Certaines tâches intégrées sont disponibles, notamment la tâche d'insertion en bloc .

Cela vaut également la peine de vérifier les méthodes de importation en bloc de fichiers plats dans SQL Server 2005.

Mise à jour: si vous débutez dans SSIS, visitez certains de ces sites pour vous mettre à niveau. 1) Principes de base du flux de contrôle SSIS 2) Prise en main de SQL Server Integration Services

Ceci est un autre Comment: sur importation du fichier Excel dans SQL 2005 .

Autres conseils

Cela va être une entreprise de streaming.

Si vous le pouvez, n'utilisez pas de transactions ici. Le coût de la transaction sera tout simplement trop élevé.

Vous allez donc lire le fichier ligne par ligne et l'insérer ligne par ligne. Vous devez sauvegarder les insertions ayant échoué dans un autre fichier que vous pourrez diagnostiquer plus tard et voir où elles ont échoué.

Au début, j’essayais d’essayer une insertion groupée de quelques centaines de lignes uniquement pour vérifier que le streaming fonctionne correctement et vous pouvez ensuite ouvrir tout ce que vous voulez.

Vous pouvez essayer d'utiliser SqlBulkCopy . . Il vous permet d'extraire de "n'importe quelle source de données".

En guise de remarque, il est parfois plus rapide de supprimer les index de votre table et de les recréer après l'opération d'insertion en bloc.

Vous pourriez envisager de passer de la récupération complète à la journalisation en bloc. Cela vous aidera à conserver une taille raisonnable à vos sauvegardes.

Je recommande totalement SSIS, vous pouvez lire des millions d’enregistrements et les nettoyer en cours de route en relativement peu de temps.

Vous devrez prévoir un peu de temps pour vous familiariser avec SSIS, mais cela devrait porter ses fruits. Il y a quelques autres discussions ici sur SO qui seront probablement utiles:

Quel est le moyen le plus rapide d'insérer en masse un grand nombre de données dans SQL Server (client C #)

Quels sont les supports pédagogiques recommandés pour SSIS?

Vous pouvez également créer un package à partir de C #. J'ai un programme C # qui lit un "fichier maître" 3GL. depuis un système existant (analyse dans un modèle objet à l'aide d'une API que j'ai pour un projet associé), prend un modèle de package et le modifie pour générer un package pour l'ETL.

La taille des données dont vous parlez n’est pas si gigantesque. Je ne sais pas quelles sont vos préoccupations en matière d'efficacité, mais si vous pouvez attendre quelques heures pour l'insérer, vous serez peut-être surpris de la facilité avec laquelle vous réaliserez cette tâche avec une technique vraiment naïve consistant à simplement INSÉRER chaque ligne, une à la fois. . Réunir un millier de lignes à la fois et les envoyer au serveur SQL peut également le rendre un peu plus rapide.

Juste une suggestion qui pourrait vous faire gagner un temps considérable en programmation, si vous n’avez pas besoin que cela soit aussi rapide que possible. Selon la fréquence à laquelle cette importation doit être exécutée, gagner quelques jours de programmation peut facilement en valoir la peine en échange d'attendre quelques heures pendant son exécution.

Vous pouvez utiliser SSIS pour le programme read & amp; insérer, mais appelez-le comme un package à partir de votre application WinForms. Vous pouvez ensuite transmettre des éléments tels que la source, la destination, les chaînes de connexion, etc. en tant que paramètre / configuration.

Procédure: http://msdn.microsoft.com/en-us /library/aa337077.aspx

Vous pouvez configurer des transformations et la gestion des erreurs dans SSIS et même créer des branches logiques basées sur des paramètres d'entrée.

Si le format de colonne du fichier correspond à la table cible dans laquelle les données doivent se terminer, je préfère utiliser l'utilitaire de ligne de commande bcp pour charger le fichier de données. Il est extrêmement rapide et vous pouvez spécifier un fichier d’erreur pour tout "impair". enregistrements qui ne parviennent pas à être insérés.

Votre application peut lancer la commande si vous devez stocker les paramètres de ligne de commande correspondants (serveur, base de données, nom d'utilisateur / mot de passe ou connexion sécurisée, table, fichier d'erreur, etc.).

J'aime mieux cette méthode que d'exécuter une commande SQL BULK INSERT car il n'est pas nécessaire que le fichier de données se trouve sur un système accessible par le serveur de base de données. Pour utiliser l'insertion en bloc, vous devez spécifier le chemin d'accès au fichier de données à charger. Il doit donc s'agir d'un chemin visible et lisible par l'utilisateur du système sur le serveur de base de données qui exécute le chargement. Trop de tracas pour moi habituellement. : -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top