Insertion lente .NET dans la database SQL Server distante

J'ai développé une application client .NET WinForms. Cette application est utilisée pour remplir une database avec des milliers d'loggings. Pour la couche de données j'ai utilisé EF6.

Lorsque je travaille et exécute l'application localement, tout fonctionne comme prévu. Les insertions sont très rapides (plus de 500 000 loggings en environ 2 minutes).

Maintenant, j'essaie d'utiliser une database distante sur un server hébergé et je remarque que les insertions sont très très lentes (less de 500 loggings en environ 2 minutes). Cela signifie 1000 fois plus lent que localement.

Si j'essaie d'insert 500 loggings dans la database distante à l'aide de SQL Server Management Studio, l'opération est terminée en less d'une seconde.

Le problème est-il sur mon application client?

Voici la fonction d'insertion:

public void SetDemoDimCustomer() { DWContext dc = null; try { dc = DWContext.Create(SqlServerInstance, DbName); dc.Configuration.AutoDetectChangesEnabled = false; dc.Database.ExecuteSqlCommand("DELETE FROM DimCustomer"); dc.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('DimCustomer', RESEED, 0)"); DimCustomer objCustomer; List<DimCustomer> lstDemoCustomers = new List<DimCustomer>(); int length = 100; for (int i = 0; i < length; i++) { objCustomer = new DimCustomer(); objCustomer.Name = "Customer " + (i + 1); objCustomer.CustomerBKey = (i + 1).ToSsortingng(); lstDemoCustomers.Add(objCustomer); } dc.DimCustomer.AddRange(lstDemoCustomers); dc.SaveChanges(); } catch (Exception) { throw; } finally { if (dc != null) { dc.Dispose(); } } } 

J'ai essayé d'utiliser Linq-to-SQL au lieu de EF6 mais le résultat est le même. Peut-être n'est pas un problème EF6 spécifique.

Quelques infos sur le système distant:

  • Système d'exploitation: Windows Server 2012
  • SGBDR: SQL Server 2014 Express

Merci d'avance.

MISE À JOUR APRÈS CERTAINS TESTS AVEC BULKINSERT

Ok voici les résultats de mes premiers tests avec BulkInsert:

  • 100 loggings -> EF6 AddRange: 9 sec. / EF6 BulkInsert: 1 sec.
  • 1000 loggings -> EF6 AddRange: 1:27 min. / EF6 BulkInsert: 1 sec. (sensationnel!)
  • 10000 loggings -> EF6 AddRange: 14:39 min. / EF6 BulkInsert: 4 sec. (wooooow!)

Maintenant, bien sûr, le package EF6 BulkInsert fait partie de mon projet.

On dirait que la plupart du time est passé sur le réseau en attente d'un aller-return à compléter. EF ne peut pas être transformé en lots (pour l'instant). Vous ne pouvez donc pas utiliser EF pour les insertions ici.

Étudiez les solutions typiques à ce problème (TVP et SqlBulkCopy).


Le model de disposition que vous utilisez n'est pas un bon choix. Enveloppez simplement dc dans'using` et supprimez toute la gestion des exceptions.

Comme suggéré, SqlBulkCopy est votre meilleur pari, cependant il y a un package de Nuget intéressant qui fait BulkInsert pour Entity Framework:

https://efbulkinsert.codeplex.com/