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 :

GROSSES lenteurs sur les requêtes MySQL


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 17
    Par défaut GROSSES lenteurs sur les requêtes MySQL
    Bonjour,
    Je développe (j'essaie) en ce moment un soft ayant pour but de gérer consultations, insertions, impressions de données contenues dans une base MySQL hébergée sur un serveur NAS. Il reste des choses à faire, comme les vérifications des données saisies, les tests d'erreur SQL, etc, mais tout est déjà fonctionnel, l'outil est opérationnel. Mon gros problème qui ne fait d'ailleurs que grossir, c'est la lenteur hallucinante du soft à afficher des données de la base. Plus la base grossit, pire c'est evidemment, mais quand même, à 15 enregistrements sur chaque table c'est déjà la misère

    Voici la BDD :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    /*==============================================================*/
    /* Nom de SGBD :  MySQL 5.0                                     */
    /* Date de création :  20/05/2010 09:49:28                      */
    /*==============================================================*/
     
     
    drop table if exists BATEAU;
     
    drop table if exists CLES;
     
    drop table if exists CLIENT;
     
    drop table if exists EMPLACEMENT;
     
    drop table if exists INTERVENTION;
     
    drop table if exists MECANICIEN;
     
    drop table if exists MOTEUR;
     
    drop table if exists TRANSMISSION;
     
    /*==============================================================*/
    /* Table : BATEAU                                               */
    /*==============================================================*/
    create table BATEAU
    (
       CODE_BATEAU          smallint not null auto_increment,
       CODE_CLIENT          int not null,
       CODE_EMPLACEMENT     int not null,
       CODE_MOTEUR          int not null,
       CODE_TRANSMI         int not null,
       NOM_BATEAU           char(35),
       TYPE_BATEAU          char(35),
       COMMENTAIRES         varchar(5000),
       primary key (CODE_BATEAU)
    );
     
    /*==============================================================*/
    /* Table : CLES                                                 */
    /*==============================================================*/
    create table CLES
    (
       CODE_CLES            int not null auto_increment,
       LIBELLE_CLES         char(25),
       primary key (CODE_CLES)
    );
     
    /*==============================================================*/
    /* Table : CLIENT                                               */
    /*==============================================================*/
    create table CLIENT
    (
       CODE_CLIENT          int not null auto_increment,
       NOM_CLIENT           char(25),
       PRENOM_CLIENT        char(25),
       FIXE_CLIENT          char(10),
       ADRESSE_RUE_CLIENT   char(150),
       ADRESSE_CP_CLIENT    char(5),
       ADRESSE_VILLE_CLIENT char(30),
       PORTABLE_CLIENT      char(10),
       FAX_CLIENT           char(10),
       MAIL_CLIENT          varchar(35),
       primary key (CODE_CLIENT)
    );
     
    /*==============================================================*/
    /* Table : EMPLACEMENT                                          */
    /*==============================================================*/
    create table EMPLACEMENT
    (
       CODE_EMPLACEMENT     int not null auto_increment,
       NOM_EMPLACEMENT      char(25),
       PONTON               char(15),
       primary key (CODE_EMPLACEMENT)
    );
     
    /*==============================================================*/
    /* Table : INTERVENTION                                         */
    /*==============================================================*/
    create table INTERVENTION
    (
       NUMERO_INTERVENTION  int not null auto_increment,
       CODE_MECANICIEN      int not null,
       CODE_CLES            int not null,
       CODE_BATEAU          smallint not null,
       DATE_INTERVENTION    varchar(35),
       HEURE_INTERVENTION   varchar(30),
       TRAVAIL_A_FAIRE      varchar(25000),
       TRAVAIL_EFFECTUE     varchar(25000),
       DUREE_INTERVENTION   int,
       HEURE_MOTEUR         int,
       primary key (NUMERO_INTERVENTION)
    );
     
    /*==============================================================*/
    /* Table : MECANICIEN                                           */
    /*==============================================================*/
    create table MECANICIEN
    (
       CODE_MECANICIEN      int not null auto_increment,
       NOM_MECANICIEN       char(20),
       PRENOM_MECANICIEN    char(25),
       primary key (CODE_MECANICIEN)
    );
     
    /*==============================================================*/
    /* Table : MOTEUR                                               */
    /*==============================================================*/
    create table MOTEUR
    (
       CODE_MOTEUR          int not null auto_increment,
       MARQUE_MOTEUR        char(20),
       TYPE_MOTEUR          char(20),
       primary key (CODE_MOTEUR)
    );
     
    /*==============================================================*/
    /* Table : TRANSMISSION                                         */
    /*==============================================================*/
    create table TRANSMISSION
    (
       CODE_TRANSMI         int not null auto_increment,
       MARQUE_TRANSMI       varchar(25),
       MODELE_TRANSMI       varchar(15),
       TYPE_TRANSMI         char(15),
       primary key (CODE_TRANSMI)
    );
     
    alter table BATEAU add constraint FK_APPARTENIR foreign key (CODE_CLIENT)
          references CLIENT (CODE_CLIENT) on delete restrict on update restrict;
     
    alter table BATEAU add constraint FK_ASSOCIATION_7 foreign key (CODE_TRANSMI)
          references TRANSMISSION (CODE_TRANSMI) on delete restrict on update restrict;
     
    alter table BATEAU add constraint FK_CORRESPONDRE foreign key (CODE_MOTEUR)
          references MOTEUR (CODE_MOTEUR) on delete restrict on update restrict;
     
    alter table BATEAU add constraint FK_MOUILLER foreign key (CODE_EMPLACEMENT)
          references EMPLACEMENT (CODE_EMPLACEMENT) on delete restrict on update restrict;
     
    alter table INTERVENTION add constraint FK_CORRESPONDRE_2 foreign key (CODE_CLES)
          references CLES (CODE_CLES) on delete restrict on update restrict;
     
    alter table INTERVENTION add constraint FK_INTERVENIR foreign key (CODE_MECANICIEN)
          references MECANICIEN (CODE_MECANICIEN) on delete restrict on update restrict;
     
    alter table INTERVENTION add constraint FK_SUBIR foreign key (CODE_BATEAU)
          references BATEAU (CODE_BATEAU) on delete restrict on update restrict;
    Exemple : cette fenêtre
    est une des pires.

    Lorsqu'on clique sur le bouton "réinitialise",
    les 3 listboxs sont reremplies de la même manière qu'au chargement de la fenêtre (qui prend également une éternité ),
    et l'AutoCompleteCustomSource de certaines TextBoxs se reremplient également.
    Voici le code du clic sur le bouton "Réinitialiser":
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    Private Sub B_Réinit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles B_Réinit.Click
            req = "SELECT CONCAT( cc.NUMERO_INTERVENTION,'  ------  sur ', NOM_BATEAU, ' ( ', TYPE_BATEAU,' ),  Le  ',DATE_INTERVENTION,'  par  ',PRENOM_MECANICIEN) FROM BATEAU ba, INTERVENTION cc, MECANICIEN me, CLIENT cl  WHERE cc.CODE_BATEAU = ba.CODE_BATEAU AND me.CODE_MECANICIEN=cc.CODE_MECANICIEN AND ba.CODE_CLIENT=cl.CODE_CLIENT"
            LB_Clients.Items.Clear()
            LB_Intervention.Items.Clear()
     
            T_Rech_Bateau.Text = ""
            T_Rech_Bateau.Text = ""
            CB_Jour.SelectedItem = Nothing
            CB_Mois.SelectedItem = Nothing
            CB_Mecano.SelectedItem = Nothing
     
     
            Dim cnxclients As MySqlConnection
            cnxclients = New MySqlConnection("Database=BDDLELU;Data Source=192.168.1.100;User Id=variK;Password=""")
            cnxclients.Open()
            Dim cmdclients As MySqlCommand
            cmdclients = cnxclients.CreateCommand()
            cmdclients.CommandText = "select NOM_CLIENT, PRENOM_CLIENT, FIXE_CLIENT, PORTABLE_CLIENT from CLIENT"
            Dim drclients As MySqlDataReader
            drclients = cmdclients.ExecuteReader()
            Do While drclients.Read()
                LB_Clients.Items.Add(drclients.GetString(0) & " " & drclients.GetString(1))
                T_Rech_Client.AutoCompleteCustomSource.Add(drclients.GetString(0) & " " & drclients.GetString(1))
                T_Rech_Client.AutoCompleteCustomSource.Add(drclients.GetString(2))
                T_Rech_Client.AutoCompleteCustomSource.Add(drclients.GetString(3))
            Loop
            cnxclients.Close()
     
            LB_Bateau.Items.Clear()
     
            Dim cnxbat As MySqlConnection
            cnxbat = New MySqlConnection("Database=BDDLELU;Data Source=192.168.1.100;User Id=variK;Password=""")
            cnxbat.Open()
            Dim cmdbat As MySqlCommand
            cmdbat = cnxbat.CreateCommand()
            cmdbat.CommandText = "select NOM_BATEAU from BATEAU"
            Dim drbat As MySqlDataReader
            drbat = cmdbat.ExecuteReader()
            Do While drbat.Read()
                LB_Bateau.Items.Add(drbat.GetString(0))
            Loop
            cnxbat.Close()
     
            Dim cnxbateau As MySqlConnection
            cnxbateau = New MySqlConnection("Database=BDDLELU;Data Source=192.168.1.100;User Id=variK;Password=""")
            cnxbateau.Open()
            Dim cmdbateau As MySqlCommand
            cmdbateau = cnxbateau.CreateCommand()
            cmdbateau.CommandText = "select NOM_BATEAU, TYPE_BATEAU, MARQUE_MOTEUR, TYPE_MOTEUR FROM BATEAU, MOTEUR"
            Dim drbateau As MySqlDataReader
            drbateau = cmdbateau.ExecuteReader()
            Do While drbateau.Read()
                T_Rech_Bateau.AutoCompleteCustomSource.Add(drbateau.GetString(0))
                T_Rech_Bateau.AutoCompleteCustomSource.Add(drbateau.GetString(1))
                T_Rech_Bateau.AutoCompleteCustomSource.Add(drbateau.GetString(3) & " " & drbateau.GetString(2))
            Loop
            cnxbateau.Close()
     
     
            Dim cnxinter As MySqlConnection
            cnxinter = New MySqlConnection("Database=BDDLELU;Data Source=192.168.1.100;User Id=variK;Password=""")
            cnxinter.Open()
            Dim cmdinter As MySqlCommand
            cmdinter = cnxinter.CreateCommand()
            cmdinter.CommandText = req
            Dim drinter As MySqlDataReader
            drinter = cmdinter.ExecuteReader()
            Do While drinter.Read()
                LB_Intervention.Items.Add(drinter.GetString(0))
            Loop
            cnxinter.Close()
     
        End Sub
    Je débute en Vb.net, je me doute donc que le code n'est pas tip top, mais est-il normal que ce code lancé par le clic sur "réinitialiser" mette environ
    10 secondes à s'effectuer ? La fenêtre clignote de partout et pendant quelques secondes le programme ne répond même plus.

    Encore une fois, il y a à peine une 15aine d'enregistrements sur ces tables.
    Et ce genre de tracas est rencontré dans pas mal d'autres endroits du soft.

    Dernière précision : croyant que cela venait du serveur NAS, j'ai testé le soft en installant la BDD en local sur ma machine (tout à fait respectable), même résultat.

    J'espère que quelqu'un pourra m'aider.

    Merci de m'avoir lu, et d'avance merci beaucoup pour votre aide.
    Cdt,
    varik

  2. #2
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Bonjour,
    c'est étrange en effet

    Tu pourrais essayer de changer tes méthodes de remplissage de listBox
    Tu changerais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      cnxbat.Open()
            Dim cmdbat As MySqlCommand
            cmdbat = cnxbat.CreateCommand()
            cmdbat.CommandText = "select NOM_BATEAU from BATEAU"
            Dim drbat As MySqlDataReader
            drbat = cmdbat.ExecuteReader()
            Do While drbat.Read()
                LB_Bateau.Items.Add(drbat.GetString(0))
            Loop
            cnxbat.Close()
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      cnxbat.Open()
            Dim cmdbat As MySqlCommand
            cmdbat = cnxbat.CreateCommand()
            cmdbat.CommandText = "select NOM_BATEAU from BATEAU"
            Dim dtbat As new DataTable ' Table reccevant les données
            Dim da as new MySqlAdapter(cmdbat) ' Création de l'adaptateur qui remplira la table
            da.Fill(dtBat) ' Remplissage de la table
            LB_Bateau.datasource = dtBat ' Table a afficher
            LB_Bateau.DisplayMember = "NOM_BATEAU" ' Nom du champs à afficher dans la listBox
            cnxbat.Close()
    Maintenant je ne comprend pas que ton code aie des lenteurs, cette méthode ne devrait rien changé mais on ne sais jamais...

    Ce que tu peux faire aussi, c'est essayé de voir quelle portion de code prend du temps, est tu sur que ce soit la connexion de la bd?
    modifie une de tes méthodes en rajoutant des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Console.writeLine("Etiquette unique " & now.Millisecond)
    de cette manière tu seras exactement quelle portion de code prend du temps...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 17
    Par défaut
    Salut,
    Je n'ai pas encore essayé ta méthode, j'y vais de ce pas.
    je répond jsute pour préciser : je ne dit pas que la connexion à la bdd est trop lente, c'est les requêtes qui prennent du temps.
    On voit la fenêtre clignoter au rthme des requêtes qui s'effectuent dans les boucles while.
    Je vais tester ta méthode, qui sait...

    Merci bien

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Par défaut
    Bonjour,

    Je pencherais effectivement pour la solution proposée par sankasssss . Je deconnecterai même la bd après le da.fill(dtbat).

    Pour ma part j'ai des BD de 500 Mo en Access2007 sur un NAS et je fais des requêtes avec jointures multiples et ça pose pas de soucis de temps de réponse, mais j'utilise ce qui vient d'être écrit. Ou pour simplifier

    Connexion
    Envoi de la commande
    Remplissage du dataset
    Déconnection

    Affichage (ou travail avec ) les données du dataset.


    cette méthode ne devrait rien changé mais on ne sais jamais...
    Si car il n'y a pas d'affichage pendant le travail sur la BD, on charge le dataset puis on affiche les données.

    Ceci dit vous n'avez pas donné la nature complète du réseau, pour ma part j'ai eu quelques soucis de lenteur il y a pas longtemps, tout cela parce que le serveur hébergeant l'active directory n'avait pas rebooter depuis un mois, le système était devenu instable et perturbait l'ensemble du réseau.

  5. #5
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Déjà tu devrais commencer par exécuter la requête sur MySql avec Explain pour regarder pourquoi ta requête est lente.

    Explain Select

    Tu peux jeter un coup d'oeil là dessus aussi...IMHO...
    Indexer les données

    Je paris que ta requête fait un table scan.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 17
    Par défaut
    Merci des réponses.
    Je suis encore en train d'adapter mon code à la méthode de sankasssss, ça prend du temps car le code que j'ai posté n'est qu'une petite partie du code de cette seule fenêtre.
    Aucun problème de réseau, et mes requêtes, effectuées directement sur le phpmyadmin du Nas par exemple, s'effectuent en environ 0.0009 sec.
    Donc peut-être que je m'exprime mal, mais ce n'est pas les requêtes qui sont lentes, c'est leur exécution via le programme en VB.
    Je finirais de modifier le code au boulot demain, et je vous tiens au courant.

    Merci encore

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 17
    Par défaut
    Bonjour,
    Après une série de changement de code, de tests ( d'échecs ), et de rechangements, etc ..
    J'ai trouvé l'origine exacte du problème. Ce n'était pas la mise en Listbox du contenu d'une requête qui causait ces lenteurs, c'était l'ajout des résultat de requêtes dans l' AutoCompleteCustomSource des TextBox. En mettant cette partie en commentaire, magie magie : plus aucune lenteur.
    Cette fonction étant assez anectodique, pas vraiment nécessaire, et à priori assez gênante sur le long terme (avec 500 clients dans la base, la suggestion devient encombrante), je l'ai tout simplement supprimée.
    Le remplissage par requête des listbox n'apportant aucune lenteur, l'affinement des recherche se fera donc dans la listbox via saisie dans les textbox correspondantes.

    Même si le fond du problème n'est pas totalement résolu (je ne sais toujours pas pourquoi le remplissage d'une AutoCompleteCustomSource prend autant de temps), dans la forme ç fonctionne niquel, donc je signale résolu.

    Merci encore de votre aide!

    A bientôt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Question sur les index mysql
    Par Cyrius dans le forum Requêtes
    Réponses: 4
    Dernier message: 08/08/2006, 22h25
  2. besoin d'aide sur une requête mysql
    Par unmulot dans le forum Langage SQL
    Réponses: 5
    Dernier message: 07/07/2006, 13h17
  3. Renseignements sur les requêtes
    Par Virgile59 dans le forum Access
    Réponses: 1
    Dernier message: 07/02/2006, 20h09
  4. Calcul de Statistics sur les requêtes
    Par Rahustro dans le forum Oracle
    Réponses: 3
    Dernier message: 17/01/2006, 06h19
  5. Optimisations mysql sur les requêtes SELECT: index
    Par leo'z dans le forum Débuter
    Réponses: 2
    Dernier message: 29/11/2003, 13h23

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