2011-10-19 4 views
5

J'ai quelques mois d'expérience de travail avec Entity Framework et écrit principalement une tonne de requêtes linq de récupération de données. Je viens d'un arrière-plan SQL lourd, et j'essaie d'optimiser une partie du SQL pour la performance et la lisibilité si j'essaye de déboguer des problèmes de performance.Entity Framework Query Optimization

Je remarque une partie de la sql généré fait des choses comme celle-ci pour une tableA avec des colonnes {col1, col2, col3}

select 
    Extent1.col1 
from 
(
    select col1, col2, col3 from tableA 
) AS Extent1 

Ma question est, comment puis-je l'empêcher de faire ces tables dérivées inutiles , et faites simplement

select col1 from tableA 

où est-il nécessaire? Je n'arrive pas à comprendre pourquoi il le fait parfois et d'autres fois il ne le fait pas ...

+0

Je suis intéressé à entendre les pensées des autres; mais je pense que ce n'est que l'un des inconvénients de l'utilisation de EF (ainsi que d'autres ORM?). Vous perdez beaucoup de contrôle sur le code SQL généré et le code SQL généré est souvent très mauvais. – CodingGorilla

+0

duplication possible de [Améliorer la requête générée à partir de l'infrastructure de l'entité] (http://stackoverflow.com/questions/7418675/improve-query-generated-from-entity-framework) –

Répondre

4

Avez-vous comparé les plans d'exécution de requête réels de la requête générée par rapport à comment l'optimiser? Vous pourriez être surpris des résultats, je sais que j'étais. Et j'ai acquis un profond respect pour les développeurs de l'équipe du serveur SQL qui semblent faire un excellent travail pour faire en sorte que ce qui ressemble à une requête sous-optimale fonctionne de la même manière.

Je serais intéressé d'entendre si votre expérience diffère de la mienne; J'ai arrêté de chercher des moyens de modifier les requêtes générées car pour chaque requête que j'essayais d'examiner, il n'y avait pas de réelle différence de performance.

EDIT: Ma dernière déclaration n'est pas tout à fait vrai, il y a certainement N + 1 situations que vous avez à surveiller, et toutes les opérations par lots (mises à jour, suppressions et insertions de plusieurs enregistrements en même temps) ne seront même pas proches de la performance pour écrire une requête à la main en raison de la nature du travail avec des enregistrements individuels. Mais les extensions externes sont essentiellement supprimées par l'optimiseur de requêtes SQL Server.

+0

Bonjour Joel, en général, vous avez raison, mais j'ai un couple de vraies requêtes désagréables qui font environ 300 lignes de long qui font cette entreprise "tables dérivées inutiles" plusieurs fois tout au long. Prendre cette requête et simplement remplacer les tables dérivées par leur sélection directe ultérieure à partir de la table contrepartie prend une requête énorme comme ça de 7 secondes à moins de 1 secondes .... donc je suis d'accord avec vous pour la plupart, mais en essayant de comprendre comment je peux mieux optimiser mon linq pour ne pas rencontrer ce problème. – Zom

+0

@Isamu: Généralement, si vous pouvez simplifier votre requête LINQ, le SQL devient également plus simple. Il y a beaucoup de techniques pour le faire, mais sans aucun code à regarder en premier lieu, il est difficile de donner des conseils spécifiques. Le gain de performances> 7x que vous signalez est-il le résultat direct de la suppression des colonnes inutiles du code généré par EF, ou effectuez-vous des transformations plus complexes? – StriplingWarrior

+1

Je suppose que vous avez pris en compte la mise en cache des requêtes lorsque vous avez testé la différence de performances ... Il y a un article de blog sur le blog de l'équipe EF (http://blogs.msdn.com/b/adonet/archive/2011/07/ 25/generated-sql-improvements-for-tpt-queries.aspx) qui est ouvert pour des commentaires sur des problèmes spécifiques liés à l'amélioration des performances pour le SQL généré. Ce post spécifique parle des améliorations qu'ils ont apportées lors de la gestion d'une hiérarchie d'héritage de classe table par type dans la version la plus récente. –