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

VB.NET Discussion :

Optimisation de requête


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif Avatar de 2h15Crew
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 79
    Par défaut Optimisation de requête
    Bonjour,

    J'ai lié avec ODBC, ma base MySQL hébergé sur un serveur, avec ma base Access. Jusque là tout va bien.
    Par contre, quand j'effectue des requêtes (a priori simples), le temps d'exécution est assez important...
    J'ai d'abord pensé que ça venait du fait que mes tables étaient liées et que Access allait chercher les données à chaque fois sur le serveur MySQL donc je suis passé par la création de vues pour optimiser.

    En effectuant la recherche dans les vues, le temps d'exécution n'a pas changé... Les tables sur lesquelles j'effectue ces requêtes contiennent tout au plus une centaines de tuples et elles sont amenées à grandir très rapidement.

    Je suis relativement nouveau avec la syntaxe Access donc soyez souples =)

    Voici mes requêtes :
    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
     
    For I As Integer = -SemDate.DayOfWeek + 1 To -SemDate.DayOfWeek + 5
                For j As Integer = 1 To DGV_STATUS.Columns.Count - 1
                    sSQL = "SELECT COUNT(RES_NoRes) FROM RESULTAT_tmp R, EMPLOYE_tmp E WHERE R.RES_NoEmp = E.EMP_NoEmp AND EMP_NumDep = " & DGV_STATUS.Columns(j).ToolTipText & " AND Format(RES_DateRes, '" & FormatDate & "') LIKE '" & SemDate.AddDays(I).ToString("yyyy/MM/dd") & "' AND RES_IsVA = 1"
     
                    rs.Open(sSQL, conn, CursorTypeEnum.adOpenStatic, LockTypeEnum.adLockReadOnly, -1)
                    Adapt.Fill(Resultat, rs)
                    rs.Close()
     
                    sSQL = "SELECT COUNT(RES_NoRes) FROM RESULTAT_tmp R, EMPLOYE_tmp E WHERE R.RES_NoEmp = E.EMP_NoEmp AND EMP_NumDep = " & DGV_STATUS.Columns(j).ToolTipText & " AND Format(RES_DateRes, '" & FormatDate & "') LIKE '" & SemDate.AddDays(I).ToString("yyyy/MM/dd") & "'"
     
                    rs.Open(sSQL, conn, CursorTypeEnum.adOpenStatic, LockTypeEnum.adLockReadOnly, -1)
                    Adapt.Fill(Resultat, rs)
                    rs.Close()
                Next
            Next
    Grosso modo, chaque requête est lancée une trentaine de fois. Je les ai séparées car je me suis apperçu que le fait de mettre plusieurs COUNT dans le SELECT n'était pas correct. Je m'explique : si un des COUNT renvoie 0, alors tous les COUNT renvoient 0...

    Pour cette portion de code, le temps d'exécution est de 7 secondes environ

    Comment se fait-il que le temps d'exécution soit aussi élevé ?
    Comment optimiser ces requêtes au mieux (pour effectuer le moins d'accès possible à la base) ?

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    c'est lent parce que tu as combiné tout ce qu'il ne faut pas ^^

    access est loin d'être le plus rapide, utilisé via dao et les recordsets c'est lent, et en plus avec des tables liées sur mysql ca plombe encore plus

    donc tu fais une seule base, et tu utilises les objets de connexions intégrés au framework, il y a des exemples partout, chercher dans la faq ou les cours (lien en haut de page)
    et pour éviter les bugs il faut utiliser des DbParameters pour passer les dates
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre actif Avatar de 2h15Crew
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 79
    Par défaut
    Merci pour tes conseils Pol63.

    Je vais utiliser la base MySQL car je trouve cela définitivement plus rapide (même si les tables sont liées).

  4. #4
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Bonjour,

    Et pourquoi ne pas faire ça en une seule requête car tu comptes en filtrant uniquement le res_isVA à 1 puis la seconde fois en ne filtrant sur rien, un group by devrait permettre de faire une seule requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sSQL = "SELECT RES_IsVA, COUNT(*) FROM RESULTAT_tmp R, EMPLOYE_tmp E WHERE R.RES_NoEmp = E.EMP_NoEmp AND EMP_NumDep = " & DGV_STATUS.Columns(j).ToolTipText & " AND Format(RES_DateRes, '" & FormatDate & "') LIKE '" & SemDate.AddDays(I).ToString("yyyy/MM/dd") & "' GROUP BY RES_IsVA"
    Si on continue pour loin, la requête est exécutée pour chaque colonne de ta grille, pourquoi encore une fois faire un group by sur la colonne correspondant au filtre. Ainsi tu réduis drastiquement le nombre d'exécution de la requête.

Discussions similaires

  1. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  2. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50
  3. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55
  4. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  5. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09

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