2015-07-18 2 views
-1

Il y a quelque temps, nous avons dû faire face au problème de l'insertion en masse \ update dans la base de données MS SQL.MS SQL Mise à jour en masse insert

La tâche était assez simple: récupérer les données de la base de données, effectuer la transformation des données et mettre à jour la table parente et remplir la table enfant. Le volume de données est énorme, c'est pourquoi nous nous sommes intéressés à la façon la plus performante de le faire. Faire tout en DB (procédures stockées, traitement de fichiers, etc) n'est pas applicable, car nous devons obtenir des informations provenant d'applications tierces.

Bien que dans Internet vous pouvez trouver beaucoup d'articles sur la façon de désactiver autoCommit et effectuer des insertions par lots \ mises à jour, de toute façon il enverra les demandes une à une. Ceci est applicable pour les pilotes jdbc libres majoritaires, y compris le plus populaire one - net.sourceforge.jtds.jdbc.Driver (http://sourceforge.net/p/jtds/discussion/129584/thread/8e89906c/). Probablement DataDirect prend en charge une telle fonctionnalité, mais ce n'est pas gratuit. FIY - List of JDBC drivers for SQL Server 2008 (comparison).

Veuillez partager avec l'expérience dans la résolution de problèmes similaires.

Cordialement,
Alex

+0

Si vous partagez des connaissances, vous pouvez séparer la partie solution de la question et l'ajouter comme réponse personnelle – Spidey

+0

@Nimesh, merci pour votre commentaire. Post mis à jour –

Répondre

0

Nous avons résolu ce problème d'une autre manière. Puisque nous devons effectuer des 2 pièces de modification de données (insérer nouvel enfant enregistrer et mettre à jour parent existant avec certains champs) en vrac nous avons réécrit les requêtes pour le faire comme ceci:

Mise à jour:

UPDATE ParentTable SET DeviceInformation = dual.DeviceInformation FROM ParentTable ptb 
    JOIN (values (1, 'info1'), (2, 'info2')) as dual (ParentTableID, DeviceInformation) 
    ON ptb.ParentTableID = dual.ParentTableID 

Le même idée pour INSERT:

INSERT INTO dbo.ChildTable 
     (ChildId, ChildNumber, Info) 
     values (1, 1, 'some text'), (2, 2, 'some text2') 

Il nous a donné une amélioration significative de la performance, puisque la plupart du temps consacré à l'établissement de la connexion.

J'espère que ce sera utile.