2009-01-01 4 views
1

J'ai une table contenant environ 1/2 million d'enregistrements.Optimisation de l'importation de données vers SQL Server 2005 avec C#

Chaque mois, nous obtenons environ 1/2 million d'enregistrements supplémentaires à importer. Ils sont actuellement placés dans une autre table de la base de données, mais seront éventuellement chargés directement à partir d'un fichier txt. Pour chacun de ces nouveaux dossiers, je dois déterminer si nous avons déjà ce dossier, et si ce n'est pas le cas, il faut l'insérer. Cependant, si nous avons l'enregistrement, il doit être mis à jour. Il y a une logique pour que ces mises à jour contiennent le code C#. Un programme de ligne de commande en C# s'occupe de l'importation de ces nouvelles données. Il y a donc actuellement 1/2 million d'instructions de sélection - une pour chaque enregistrement. Ensuite, un tas (encore environ 1/2 million) d'instructions insert et update sont générées et exécutées sur la base de données.

Cela prend environ 6 heures pour que cela fonctionne sur mon poste de travail. Avez-vous des idées sur la façon de l'accélérer? J'ai besoin de parcourir environ 60 de ces grandes importations pour ramener la base de données au mois en cours, puis charger les nouvelles données une fois par mois.

Je pense qu'un domaine qui pourrait être amélioré est le 1/2 million d'instructions select. Peut-être que je pourrais émettre une déclaration select pour obtenir toutes les lignes, et les stocker en mémoire, et le rechercher. Pourrais-je utiliser une liste pour cela, ou y a-t-il un meilleur cours? Je vais devoir effectuer une recherche en fonction de deux propriétés (ou champs de base de données).

Répondre

1

Oui, déplacez la logique vers un seul proc stocké qui effectuera une insertion en bloc dans une table temporaire (sans journalisation, puis traiter tous les enregistrements de la table temporaire dans deux instructions distinctes ... Une mise à jour pour tous les des documents qui existent dans la desti Table et un insert pour tous ceux qui ne le font pas

Update DestTable Set 
     ColName = T.ColName, 
     [repeat for all cols] 
    From TmpTable T Join DestTable D On D.Pk = T.Pk 

    Insert DestTable(ColList) 
    Select [ColList] 
    From TmpTable T 
    Where Not Exists (Select * From DestTable 
         Where pk = T.Pk) 

Si cela crée des transactions trop importantes pour votre journal des transactions, le casser en petits morceaux

2

Jetez un coup d'œil à la classe SqlBulkCopy de .NET Framework 2.0.

MSDN Ref.

+0

Merci, je vais Je ne suis pas sûr que ça vaudrait la peine de refaire tout le LINQ-to-SQL pour l'insertion et la suppression de requêtes, mais il se peut que je doive le faire si je veulent de meilleures performances. –

Questions connexes