Quel est l'impact sur les performances de LinqToSql par rapport à ADO.Net simple pour une database SQL Server très simple?

Je développe une application de calcul de nombre en C #. Il va utiliser une database d'une structure de table très simple (avec de nombreux loggings) et n'a pas de clients concurrents (mais peut-être quelques threads d'un) pour y accéder mais faire plusieurs milliers de get / inserts / updates séquentiels. Devrais-je mieux utiliser l'interrogation ADO.Net ou LinqToSQL?

Cela n'a pas l'air évident pour moi – peut-être que LinqToSql est meilleur en raison de la mise en memory tampon (+ lisibilité), peut-être que c'est mauvais à cause de sa surcharge.

MISE À JOUR 1:

J'ai un model très simple ici – 3 tables d'environ 10 champs chacune. Pas de foreign keys (la normalisation est sacrifiée au principe KISS). Je pourrais utiliser des arrays Excel pour cela, mais je préfère coder C # + SQL plutôt que VBA et je crois que SQL Server est plus rapide (et permet plus d'loggings).

MISE À JOUR 2:

Je n'ai pas vraiment besoin d'ORM, une simple requête SQL serait suffisante. Je considère LinqToSql pour trois raisons: 1. elle permet une génération de database visuelle et en premier, 2. LINQ semble mieux que d'avoir des requêtes sous forme de littéraux de string. 3. Logiquement, il semble que cela puisse (ou non) augmenter les performances grâce à des mises à jour en masse / à des mises en cache, à des lectures en cache et à un chargement paresseux.

MISE À JOUR 3:

J'ai 4 Go de RAM et ne me dérange pas l'application pour utiliser tous les concerts pendant le traitement des données.

En général, count tenu de votre description, vous ferez bien avec Linq-to-sql

Un mot d'avertissement – vous écrivez dans votre question

logiquement, il semble que cela puisse (ou non) augmenter les performances grâce à des mises à jour en vrac / mises en place, à des lectures mises en cache et à un chargement paresseux.

Linq n'augmentera certainement pas vos performances en cas de mises à jour / insertions en bloc. Au contraire, les mises à jour groupées avec SP ou les encarts en masse avec SqlBulkCopy sont plus rapides que Linq-sql.

Chaque fois que vous effectuez cette quantité d'access aux données séquentielles, quelques questions évidentes (qui n'ont rien à voir avec LINQ-to-SQL vs raw ADO.NET) sont:

  • pourriez-vous tirer des lists plutôt que d'get
  • pourriez-vous faire tout le truc à la database

LINQ-to-SQL ajoute beaucoup de commodité et de vérification statique, et généralement les frais généraux sont minimes; Cependant, si vous chargez des lots (milliers) d'loggings dans un seul context de données, le gestionnaire d'identités a plus de travail à faire, ce qui peut légèrement affecter les performances. Nous remarquons aussi parfois des pauses inexpliquées dans les time de chargement LINQ-to-SQL (le TSQL prend 1ms et l'object met 80ms à se matérialiser) – c'était sporadique et difficile à reproduire, mais pour le travail en masse nous avons fini par écrire dapper comme un rlocation en continu permettant une matérialisation pratique dans un style LINQ-to-SQL, sans cette surcharge – mais aussi sans la possibilité de le muter et de pousser les changements vers le bas; p Bien sûr, vous pouvez essayer de Attach etc.

Sam Saffron a créé un micro ORM appelé dapper. Le site Web du projet a quelques points de reference que vous pourriez être intéressé à regarder. Ils comparent DataReader brut avec diverses implémentations ORM, y compris LinqToSql

Ne vous souciez pas des frais généraux de toute technologie, sauf si vous travaillez sur un projet sensible aux performances élevées ou si vous rencontrez des problèmes de performances mesurables.

L'optimization prématurée est la racine de tout Mal. Jetez un oeil à http://c2.com/cgi/wiki?PrematureOptimization

En réponse aux commentaires: Ma réponse initiale était principalement orientée vers la dernière partie de la question, dans laquelle le PO fait part de ses préoccupations concernant les frais généraux d'une technologie de niveau supérieur (requêtes LINQ) sur une technologie de niveau inférieur (requêtes brutes). Bien sûr, vous ne devriez pas ignorer la performance du tout. Mais comme le PO parle d'un type d'application plutôt simple, il devrait faire une grande différence en termes de performance. Dans ces cas, je choisirais toujours la technologie de plus haut niveau en raison de la lisibilité, de la flexibilité et de la maintenabilité.

pour y accéder mais faire beaucoup de milliers de get / inserts / updates séquentiels.

Si c'est ce que vous faites, vous devriez utiliser ADO.Net.

Il y a cinq façons d'interroger datatables d'une seule table avec LinqToSql. Ici, ils sont dans le plus lent au plus rapide:

Sequential obtient

C'est lent car un tree d'expression doit être traduit en sql et un roundsortingp de database doit se produire pour chaque ligne.

N trees d'expression et génération de methods dynamics. N allers-returns de database.

 from c in myDC.Customers where c.Id = myId select c; 

Sequential ComstackdQuery

1 tree d'expression et génération de méthode dynamic. N allers-returns de database.

 Func<MyDataContext, int, IEnumerable<Customer>> comstackdQuery = (dc, i) => from c in dc.Customers where c.Id = i select c; 

A distance

N / PageSize tree d'expression et génération de méthode dynamic. N / PageSize des allers-returns de database.

 (from c in myDC.Customers where c.Id > myId order by c.Id select c).Take(pageSize) 

Option 2

  --note, sql server has an upper limit of ~2100 parameters. from c in myDC.Customers where myIds.Contains(c.Id) select c; 

Compilé à distance obtient

1 tree d'expression et génération de méthode dynamic. N / PageSize des allers-returns de database.

 Func<MyDataContext, int, IEnumerable<Customer>> comstackdQuery = (dc, i) => from c in dc.Customers where c.Id > i order by c.Id select c).Take(pageSize) 

Option 2

 --note, .Contains method not supported by comstackd query due to varying parameter count. --instead the expression has to be built from the ground up - this is hard, but not impossible. 

Table Dump

1 tree d'expression et génération de méthode dynamic. 1 aller-return de database. Un tableau à la baisse peut être trop volumineux pour être conservé en memory ou une requête peut être exécutée pendant un timeout d'attente.

 from c in myDC.Customer select c; 

Avec ADO.Net, vous n'exécutez pas de traduction Expression-> Sql et la méthode qui transforme les lignes DataReader en objects est écrite par vous et n'est pas générée dynamicment. Vous devriez voir les performances au niveau ComstackdQuery par défaut.