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

Linq Discussion :

time out de ma requete


Sujet :

Linq

  1. #1
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 90
    Points : 78
    Points
    78
    Par défaut time out de ma requete
    Bonjour,
    quelqu’un sais me dire pourquoi, cette requet vas en timeout ?
    Merci
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var tracks = (from c in ctx.TrackDatas
                        orderby c.TrackDate ascending
                        where iddevicesInContraints.Contains(c.IDDevice) && c.TimeStamp <= endDate && c.TimeStamp > startDate
                        select c).ToList();

  2. #2
    Membre confirmé

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 244
    Points : 574
    Points
    574
    Par défaut
    Hello,
    Que contient iddevicesInContraints ? Combien y a-t-il d'éléments ?
    "C'est tellement merdique que toute modification est une amélioration !"

  3. #3
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    A priori c'est soit un problème de performance lié à la structure de la requête, soit un problème de connexion... Il nous faut le message d'erreur exact, peux-tu l'indiquer ? S'il y a une InnerException merci également d'indiquer le message.

    On peut déjà analyser la requête :
    • Quand tu fais un Contains dans une clause WHERE, ça équivaut à faire un LIKE en SQL, ce qui est catastrophique pour les performances, et à éviter absolument. Même s'il y a un index sur la colonne, celui-ci ne sera pas utilisé.
    • Si ta colonne Timestamp n'est pas indexée correctement dans la base de données, cela nuit également aux performances.

    Plus il y a de volumétrie (taille des champs en question et/ou nombre de lignes) plus ces deux points dégraderont les performances.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  4. #4
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 90
    Points : 78
    Points
    78
    Par défaut
    Oui , vous avez raison c'est un problème de performance, la table TrackDatas contiens plus de 80 million de ligne.
    je dois transformer ma roquette, les suggestions sont bien accepté.
    merci

  5. #5
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 90
    Points : 78
    Points
    78
    Par défaut
    bonjour,
    Quelqu'un peux me proposer une solution !
    j'ai essayé d'autre vois mais sans succès.
    Merci

  6. #6
    Membre confirmé

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 244
    Points : 574
    Points
    574
    Par défaut
    Hello,

    Je ne vois pas trop comment tu peux améliorer la requête, pour moi elle est basique. Le .Contains(...) est transformé en IN (...) (et non en LIKE) et utilise a priori les index (j'ai trouvé d'ailleurs un article intéressant sur l'utilisation des index par les clauses LIKE : http://myitforum.com/cs2/blogs/jnels...16/108354.aspx).
    D'ailleurs y a-t-il des index sur ces colonnes ? c'est peut-être là qu'il faut creuser.
    Essaie d'effectuer des tests dans SQL Server Management Studio, tu peux récupérer la requête générée comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    IQueryable<TrackDatas> query =
        from c in ctx.TrackDatas
        orderby c.TrackDate ascending
        where iddevicesInContraints.Contains(c.IDDevice)
           && c.TimeStamp <= endDate && c.TimeStamp > startDate
        select c;
    var objectQuery = query as System.Data.Objects.ObjectQuery;
    Trace.TraceInformation(objectQuery.ToTraceString());
    Ça te permettra d'avoir le plan d'exécution et de voir là où ça pèche.
    "C'est tellement merdique que toute modification est une amélioration !"

  7. #7
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par plume13 Voir le message
    Le .Contains(...) est transformé en IN (...) (et non en LIKE)
    Effectivement, tu as raison dans ce cas ça se transforme bien en IN.

    Citation Envoyé par plume13 Voir le message
    et utilise a priori les index (j'ai trouvé d'ailleurs un article intéressant sur l'utilisation des index par les clauses LIKE : http://myitforum.com/cs2/blogs/jnels...16/108354.aspx).
    Oui du coup si on passe par une clause IN, l'index est utilisé. Par contre en LIKE, il n'est utilisé que dans le cas où il y a un préfixe ou pas de wildcard (ex. LIKE 'toto%' ou LIKE 'toto').

    Citation Envoyé par plume13 Voir le message
    D'ailleurs y a-t-il des index sur ces colonnes ? c'est peut-être là qu'il faut creuser.
    Oui je pense aussi qu'il faut creuser dans ce sens, et voir à quoi ressemble le plan d'exécution...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  8. #8
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 90
    Points : 78
    Points
    78
    Par défaut
    Excuser moi mais c'est ce que me permets de débloquer la situation pour le moment.
    sachant que iddevicesInContraints contienne une dizaine de record,
    et TrackDatas contienne des centaine de million de record
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
                    foreach (var idg in iddevicesInContraints)
                    {
                      List<Data> trackList = new List<Data>();
                      count = count + 1;
                      decimal f = idg;
                      trackList = (from c in ctx.TrackDatas
                                orderby c.TrackDate ascending
                                where c.IDDevice == f && c.TimeStamp <= endDate && c.TimeStamp > startDate
                                select c).ToList();
                      trackListFinale.AddRange(trackList);
                      if (count == vr) {
                          tracks = trackListFinale as IEnumerable<Data>;
                          break; 
                      }
     
                       return tracks
                    }
    merci

  9. #9
    Membre confirmé

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 244
    Points : 574
    Points
    574
    Par défaut
    Ah... et tu obtiens ce que tu souhaites avec ce code ? Je suis perplexe étant donné que tu ne peux passer qu'une seule fois dans la boucle foreach (à cause du break; ou du return ...; )
    Pour moi le problème, c'est la base. Il n'y a pas de raison que ça parte en timeout avec quelque chose de si simple, même si il y a des millions d'enregistrements.
    "C'est tellement merdique que toute modification est une amélioration !"

  10. #10
    Membre régulier
    Inscrit en
    Février 2004
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 90
    Points : 78
    Points
    78
    Par défaut
    Bonjour,
    Tu as bien raison, ya eu un problème dans copy e coller du code
    le return tracks c'est après terminer le cicle foreach, donc après la balise
    fermeture du cicle.
    mais sois sure, sans la modification la requête ne fonctionne pas.
    Merci

Discussions similaires

  1. [Session]maîtriser le time out de la session
    Par croquedur dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 23/10/2007, 10h57
  2. [10g] ORA-01013 Time out
    Par rv78 dans le forum Oracle
    Réponses: 22
    Dernier message: 11/01/2006, 11h58
  3. MSXML2.serverXMLHTTP : The operation timed out
    Par malbaladejo dans le forum ASP
    Réponses: 1
    Dernier message: 06/12/2005, 08h50
  4. Problème de time-out avec un socket client.
    Par Depteam1 dans le forum MFC
    Réponses: 3
    Dernier message: 17/10/2005, 10h30
  5. error time out expired
    Par the_new dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/03/2005, 13h03

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