Je rencontre des problèmes de performance vraiment étranges liés à une requête très simple utilisant Entity Framework Code-First avec le framework .NET version 4. La requête LINQ2Entities ressemble à ceci :
context.MyTables.Where(m => m.SomeStringProp == stringVar);
Cela prend plus de 3000 millisecondes pour s'exécuter. Le SQL généré semble très simple :
SELECT [Extent1].[ID], [Extent1].[SomeStringProp], [Extent1].[SomeOtherProp],
...
FROM [MyTable] as [Extent1]
WHERE [Extent1].[SomeStringProp] = '1234567890'
Cette requête s'exécute presque instantanément lorsqu'elle est exécutée via Management Studio. Lorsque je change le code C# pour utiliser la fonction SqlQuery, elle s'exécute en 5 à 10 millisecondes :
context.MyTables.SqlQuery("SELECT [Extent1].[ID] ... WHERE [Extent1].[SomeStringProp] = @param", stringVar);
Ainsi, même SQL, les entités résultantes sont suivies dans les deux cas, mais il y a une grande différence de performance entre les deux. Qu'est-ce qui se passe ?
2 votes
Je suppose que vous rencontrez des retards d'initialisation - probablement la compilation de la vue. Voir MSDN:
Considérations de performance pour Entity Framework 5
0 votes
J'ai essayé de pré-générer les vues, et cela ne semble pas aider. De plus, j'ai exécuté une autre requête EF avant la lente pour exclure les trucs d'initialisation. La nouvelle requête s'est exécutée rapidement, la lente s'est encore exécutée lentement, même si la préparation du contexte s'est déroulée lors de la première requête.
1 votes
@marc_s - Non, SqlQuery renverra une instance d'entité entièrement matérialisée et suivie des changements. Voir msdn.microsoft.com/en-us/library/…
0 votes
Est-ce que le SQL généré pour votre requête EF inclut réellement la valeur du paramètre, ou utilise un paramètre? Cela ne devrait pas affecter la vitesse de la requête pour une requête individuelle, mais pourrait causer un gonflement du plan de requête sur le serveur au fil du temps.
0 votes
Avez-vous essayé d'exécuter la même requête deux fois / plusieurs fois ? Combien de temps cela a-t-il pris lors de la deuxième exécution ? Avez-vous essayé ceci sur le framework .NET 4.5 - il y a quelques améliorations de performance liées à EF dans le framework .NET 4.5 qui pourraient aider.
0 votes
@JimWooley - Non, EF encaisse la valeur de la chaîne. Je suppose que je pourrais essayer de le coder en dur dans mon appel SqlQuery pour voir si j'obtiens des performances similaires (mauvaises), mais comme vous l'avez dit, je doute que ce soit ça.
0 votes
EF détecte si la variable est une constante ou saisie par l'utilisateur et l'intègre ou la paramètre correctement. Je doute que ce soit le problème avec votre requête, mais essayez de la rendre une variable modifiable et de la retester.
0 votes
@Kiquenet - Il n'y a vraiment pas beaucoup plus de code source à montrer en dehors de ce qui est dans la question et dans la réponse.