IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entity Framework Discussion :

Performances horribles sur certaines requêtes Entity


Sujet :

Entity Framework

  1. #1
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut Performances horribles sur certaines requêtes Entity
    Hello,

    on constate que certaines listes d'objets prennent 20-25 secondes à être générées via EF.

    Via SQL Server Profiler, on retrouve une durée de cet ordre de grandeur (par ex 21 sec), avec, à titre d'information, 1461 pages lues et 60 000 enregistrements présents dans la table pour la requête concernée.

    La requête exécutée est un bête select, même pas de jointure...

    Si on prend la requête affichée par SQL Server Profiler et qu'on l’exécute dans management studio, la requête prend 0 à 1 sec...

    Qu'est ce qui peut expliquer ça ?

    EDIT :

    Je refais un test avec tous les appels via c#. Les résultats (en ms, mesuré dans le code via un Stopwatch)

    EF : 22227,2778 //Context.Sequence.ToList()
    SQL : 2,3137 //SqlCommand sqlCom = new SqlCommand("select * from Sequence", cnx);
    EF Store Query : 46,4585 //contextNv.ExecuteStoreQuery<Sequence>("select * from Sequence");
    Si je commence par faire un appel via ExecuteStoreQuery, j'obtiens ceci :

    EF Store Query : 685,0155
    EF : 22816,2245
    SQL : 2,3236
    Donc je vois bien le temps pris pour la compilation de la requête, mais aucun impact sur la requête via ToList

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Bizarre...tu as essayé avec NoTracking?
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    context.Sequence.MergeOption = System.Data.Objects.MergeOption.NoTracking;
    Je passe de requêtes qui prennent 22 sec à des requêtes de 16 secondes, mesuré au Stopwatch

  4. #4
    Invité
    Invité(e)
    Par défaut
    On sait que ça rame au niveau d'Entity Framework alors je te conseille de regarder tout ça en utilisant l'outil DotTrace JetBrain (une version démo est dispo et largement suffisant pour te faire ton avis). Il y a aussi EFProf que tu peux utiliser.

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    EF Profiler m'affiche la requête générée et me dit que la requête sql a duré 3ms, pour une durée totale de 20s.
    Le débogueur visual studio indique qu'il passe tout son temps dans le ToList sans être plus précis.
    Avec JetBrain, on observe qu'il passe la majorité de son temps dans des GetInternalRelatedEntity, la table présente 13 FK.

  6. #6
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    Bonjour,

    A mon avis il charge toute ton arborescence d'objets, c'est une peu long...
    Si j'étais toi, j'essayerai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    context.ContextOptions.LazyLoadingEnabled = true;
    Bon dév.
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Je descends de 23 à 17sec au mieux.

  8. #8
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    C'est un début, je te conseille ce lien

    Bon courage
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  9. #9
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Avec le mergeOptions Notracking en plus, je descends à 12sec. Mais ça reste éloigné de la seconde pour une StoreQuery. Il faut que je voie pour les relations, c'est ce qui semble ncore consommer beaucoup de temps, malgré les null

  10. #10
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    Ce lien peut être intéressant aussi...

    Mais pourquoi ne fais-tu pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contextNv.Sequences.ToList();
    ici, j'ai utilisé sequences mais il peut très bien s'appeler autrement chez toi
    au lieu d'une requête?
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  11. #11
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EF : 22227,2778 //Context.Sequence.ToList()
    C'est mon code actuel d'utiliser le ToList, ce que je chereche à améliorer. la requête était pour comparer les perfs.

    Merci pour le lien, je vais y jeter un œil.

  12. #12
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Un détail:
    A quoi est mappé SEQUENCE dans ton EDMX? directement à la table SEQUENCE?
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  13. #13
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Oui, mapping direct

  14. #14
    Invité
    Invité(e)
    Par défaut
    Au vu des solutions déjà proposées et que ça ne règle toujours pas ton problème, peut-être que tu devrais penser à générer les vues pour EF. Entity Framework Power Tools te permet de générer assez facilement sans passer par la ligne de commande.

Discussions similaires

  1. [Entity Framework] Performances désastreuses sur la pagination
    Par kedare dans le forum Développement
    Réponses: 30
    Dernier message: 25/01/2011, 17h44
  2. Transaction sur Requêtes Entities et Requêtes SQL pures
    Par Arnard dans le forum Accès aux données
    Réponses: 1
    Dernier message: 20/04/2009, 13h38
  3. Réponses: 8
    Dernier message: 21/09/2007, 14h51
  4. Réponses: 3
    Dernier message: 10/02/2007, 23h28
  5. [BDD][Mysql] Problème récurant sur certaines requêtes
    Par citizen_yule dans le forum Requêtes
    Réponses: 3
    Dernier message: 11/04/2006, 22h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo