2010-01-15 4 views
7

J'ai une requête sur ma page qui prend au moins une demi-seconde pour s'exécuter en utilisant EF 3.5. Lorsque j'ai utilisé une procédure stockée, la vitesse était nettement plus rapide. C'est une requête très complexe. Y aura-t-il des améliorations de performance dans le futur EF 4.0? Et EF 4.0 bat-il vraiment 3,5 performance sage?Quelle est la performance de entity framework 4 par rapport à entity framework 3.5?

+1

Dans une question secondaire, avez-vous examiné les différences dans le plan d'exécution entre votre procédure stockée et celle générée par EF 3.5? – Kane

Répondre

3

La réponse courte est qu'il est trop tôt pour le dire. Les gars de .Net se concentrent presque entièrement sur la performance jusqu'à ce que la sortie du 12 avril soit finalisée et localisée. Aussi, que veut-on dire par plus rapide? Plus rapide peut être considéré de plusieurs façons, par exemple:

  • Entity Framework 4.0 has new features, les seules améliorations de suivi d'objets peut signifier d'énormes victoires puisque vous ne faites pas que le travail manuel vous ... en tout cas, au moins plus rapide de développement .
  • Si cela ne fonctionnait pas du tout auparavant, les objets plus légers avec POCOsupport peuvent signifier que beaucoup moins de mémoire est décalée pour beaucoup d'objets. Quel que soit le coût de remplissage des propriétés supplémentaires lors de l'extraction à partir de la base de données, il existe un coût d'instanciation et de suivi de celles-ci (temps de chargement et consommation de mémoire).

Dans votre cas, une demi-seconde est un à long temps pour quoi que ce soit, mais très complexe ou haute requête de volume ... avez-vous regardé pour voir combien de temps est passé dans la base de données et combien de temps est passé une fois. Net a les données? Si vous passez la plupart de votre temps en dehors de SQL alors oui, les améliorations de base dans les réflexions dans Net 4.0 devraient vous fournir une amélioration de la vitesse ... cependant, si vous passez tout votre temps en SQL, cela n'aidera pas beaucoup du tout. La majeure partie de votre problème de performance peut être l'indexation des performances d'hydratation générées par SQL et non par Entity Framework.

Je voudrais suivre le commentaire de Kane, regardez le SQL qu'il génère pour votre requête, est-il possible pour vous de publier cela et la procédure stockée est rapide afin que nous puissions peut-être trouver où le problème réside?

1

Des ADO.NET blog:

Personnalisation des requêtes - Ajout du support pour les opérateurs de LINQ existants, reconnaissant un plus grand ensemble de motifs avec LINQ, modèle d'écriture défini fonctions ainsi que la capacité de utiliser dans LINQ , et un certain nombre de autres façons de créer et de personnaliser requêtes.

Génération SQL Lisibilité Améliorations - Amélioration de la lisibilité , ainsi que des optimisations de performance TSQL , des plus faciles à faire beaucoup de requêtes générées pour comprendre ce qui se passe

Ainsi, ces deux points implique que vous pourriez voir des améliorations dans la façon dont il génère votre requête à partir de LINQ.

Cependant, il est peu probable qu'un ORM soit capable de surpasser une requête que vous avez écrite à partir de zéro car il doit prendre en charge de nombreux scénarios différents, et généralement le plus courant est défini par défaut. EF 3.5 a semblé produire un SQL de jointure très efficace quand je l'ai utilisé, probablement le meilleur que j'ai vu d'un ORM donc il y a de l'espoir que vous pouvez abandonner le SP dans 4.0. Si vous avez une procédure stockée, je suppose que c'est une grosse requête - l'envoi de ce texte SQL à chaque fois au serveur causera beaucoup de trafic sur le réseau, ce qui est une autre chose que vous pourriez avoir envisagée ou non. Évidemment, sur le même serveur ou dans le même réseau interne, une optimisation du style «couper vos cheveux pour perdre du poids».

0

Quand il s'agit de requêtes vraiment complexes, je n'ai vu aucune preuve que L2S, NH ou EF puisse générer un meilleur plan de requête que je peux dans un sproc. J'aime ORM (en particulier NH), mais il y a encore des moments où temps d'exécution ORM peut être curbstomped par un sproc bien écrit.