2011-07-26 3 views
1

Nous avons une longue opération de base de données. Lorsque nous effectuons cette opération avec enlist = true, cela prend 29 minutes. Lorsque nous effectuons cette opération avec enlist = false, cela ne prend que 15 minutes. Quelle est la raison d'un tel énorme succès? Est-ce quelque chose lié au serveur de base de données?Transaction Enlist problème de performance

Comment l'éviter? S'il vous plaît partagez vos pensées.

Base de données: SQL Server 2005

Frameowrk: .Net 3.0

+1

a: quelle est la nature de l'opération (beaucoup de petits exécute un gros exécuter etc??) et b: est-il en fait un transaction à l'époque? –

+0

Le nombre total de lignes dans un fichier csv est 100000. Ces enregistrements doivent être insérés dans une table. Nous appelons la même procédure stockée environ 5 fois. Le paramètre est transmis en tant que chaîne concaténée à la procédure stockée. Il y aura un gros encart ayant environ 20000 enregistrements dans chaque itération du SP. – Lijo

+1

Suggérez-vous du code postal et peut-être même vos paramètres de serveur/base de données. –

Répondre

3

Comment pouvons-nous éviter?

et

Nombre total de lignes dans un fichier csv est 100000.

Dans ce cas, utilisez SqlBulkCopy pour écrire les 100.000 lignes dans une table de mise en scène (une base et séparée table, ne fait pas partie de vos tables transactionnelles, pas de déclencheurs, de clés étrangères, etc.). Une fois que les données se trouvent dans la table de transfert, utilisez TSQL (direct ou SPROC) pour exécuter le INSERT de la table de transfert dans la table transactionnelle , c'est-à-dire où résident vos données. La transaction doit seulement couvrir cette dernière opération.

Cela permet d'atteindre plusieurs éléments clés:

  • SqlBulkCopy utilise la même API en vrac-insert; Il est le moyen le plus rapide de transférer de grandes quantités de données sur le serveur à SQL Server
  • il minimise la taille de la transaction, notamment en n'incluant pas tout le temps de transfert de données dans la transaction; seul le noyau INSERT est transactionnel, mais à ce stade, toutes les données sont locales
+1

+1. Staging, comme décrit, est certainement le chemin à parcourir. –

+0

Merci ... SQLBulkCopyworks 10 fois fatser: -) ... Lire http://stackoverflow.com/questions/6855871/bulkcopy-from-stored-procedure aussi – Lijo