Partage
  • Partager sur Facebook
  • Partager sur Twitter

MySQL, Problème de lenteur

    5 mars 2021 à 13:58:58

    Bonjour, 

    J'ai des latences qui commence doucement à se faire ressentir dans une application (je pense que c'est paracerque je réalise des calculs par cumul), 

    (Sur le premier mois de test l'application était très fluide) 

    Le fonctionnement de l'application : 

    Comment je réalise les calculs (de manière simplifié) : 

    **********************

    - FOR TabRow.count (Avoir tous les ID) 

         - IF T1

              - var a = Select (SUM(H1) + SUM(H2) + ... + SUM(H23) AS T1 FROM Table2 WHERE id = @id AND type = T1

              - UPDATE Table1 SET T1 = a

         - IF T2

               - var b = Select (SUM(H1) + SUM(H2) + ... + SUM(H23) AS T2 FROM Table2 WHERE id = @id AND type = T2

               - UPDATE Table1 SET T2 = b

         - UPDATE Table1 SET rendement = b/a WHERE id = @id

    *****************

    J'ai un Timer qui me lance cette opération toutes les minutes. 

    Supposition : 

    Je pense que les ralentissements peuvent venir des id qui sont toujours EN COURS (présent dans le tableau) depuis plus de 3 mois : 

         - Les lignes du tableau commence à s'accumuler (plus d'itération dans la boucle)

         - Des calculs en cumul sur des 100tain de jours 

         - Nombres de PC ayant la page ouverte

    Je voulais dans un premier temps avoir un avis sur le problème

    *** EDIT : Je pense qu'une des meilleures solutions serait d'essayer de faire les calculs avec du VB : Récupérer le total des jours précédant T1 et T2 avec une requête SQL puis ajouter les valeurs d'aujourd'hui T1 et T2 (timer (minute)) avec du VB.  

    Peut être ça vient d'ailleurs, je pense que dans un premier temps il me faut identifier les requêtes qui prennent le plus de temps et essayer de les améliorer. 

    Si besoin je reposte mes requêtes qui pose problème quand j'aurais accès à la base de données.   

    Je vous remercie d'avances pour vos réponses. 

    -
    Edité par DeveloSt 5 mars 2021 à 15:21:23

    • Partager sur Facebook
    • Partager sur Twitter

    Site Internet : https://devst.go.yj.fr

      5 mars 2021 à 16:05:08

      Bonjour,

      Déjà, faire des requêtes dans une boucle ce n'est vraiment pas top ...

      Stocker le résultat d'un calcul dans une colonne non plus ...

      A mon avis tu devrais être en mesure de faire ce calcul au sein d'une seule et même requête, sans passer par des UPDATE ...

      Mais, te connaissant un peu, que ce sera sûrement dur de te tirer les vers du nez pour comprendre ce que tu fais et ton modèle :D

      -
      Edité par Benzouye 5 mars 2021 à 16:05:25

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        11 mars 2021 à 12:33:42

        Bonjour, 

        Merci pour ta réponse

        Les lenteurs commence à se faire quand il y a une 60 de PC connecté sur l'application 

        Benzouye a écrit:

        Déjà, faire des requêtes dans une boucle ce n'est vraiment pas top ...

        A cause de la structure de ma table je ne pense pas pouvoir sortir mes requêtes de la boucle, mais ce que je peux faire c'est réduire le nombre d'itérations 

        Benzouye a écrit:

        Stocker le résultat d'un calcul dans une colonne non plus ...

         Ca m'évite de faire de lourd calcul à chaque fois et me simplifie pour faire d'autres calculs avec le résultat des ses calculs

        Benzouye a écrit:

        A mon avis tu devrais être en mesure de faire ce calcul au sein d'une seule et même requête, sans passer par des UPDATE ...

        Avec une procédure ça me donne cela que j'exécute 1 fois toutes les heures : 

        BEGIN
        DECLARE o INT DEFAULT 0;
        DECLARE i INT DEFAULT 0;
        
        DECLARE vof VARCHAR(45) DEFAULT 0;
        DECLARE vfamille VARCHAR(45) DEFAULT 0;
        
        DECLARE vSESA VARCHAR(45) DEFAULT 0;
        
        DECLARE NomColonne VARCHAR(45) DEFAULT 0;
        
        DECLARE vh VARCHAR(45) DEFAULT 0;
        SET vh = (SELECT (CASE WHEN HOUR(NOW()) < 10 THEN RIGHT(HOUR(NOW()),1) ELSE HOUR(NOW()) END) AS heure);
            
        SET NomColonne = CONCAT('h', vh);   
            
        SELECT DISTINCT COUNT(CONCAT(ofab, famille)) FROM lds.horaire LEFT JOIN operateur ON operateur.SESA = horaire.SESA WHERE operateur.ofab <> 'None' AND str_to_date(date, '%d/%c/%Y') = (SELECT (CASE WHEN HOUR(NOW()) < 5 THEN DATE(NOW()) - 1 ELSE DATE(NOW()) END) AS heure) AND type_donnee = 'OT' INTO o;
        SET i=0;
        WHILE i<o DO 
        	
            SET vof = (SELECT ofab FROM lds.horaire LEFT JOIN operateur ON operateur.SESA = horaire.SESA WHERE operateur.ofab <> 'None' AND str_to_date(date, '%d/%c/%Y') = DATE(NOW()) AND type_donnee = 'OT' GROUP BY ofab, famille, SESA LIMIT i,1);
            SET vfamille = (SELECT famille FROM lds.horaire LEFT JOIN operateur ON operateur.SESA = horaire.SESA WHERE operateur.ofab <> 'None' AND str_to_date(date, '%d/%c/%Y') = DATE(NOW()) AND type_donnee = 'OT' GROUP BY ofab, famille, SESA LIMIT i,1);
            SET vSESA = (SELECT SESA FROM lds.horaire LEFT JOIN operateur ON operateur.SESA = horaire.SESA WHERE operateur.ofab <> 'None' AND str_to_date(date, '%d/%c/%Y') = DATE(NOW()) AND type_donnee = 'OT' GROUP BY ofab, famille, SESA LIMIT i,1);
            
            
        		SET @SQLupdate = 'UPDATE lds.horaire SET NomColonne = (SELECT 
        			SUM(CASE WHEN etat = ''TERMINE'' AND evenement.TypeEvenement = ''P1'' AND LEFT(hfin,2) = HOUR(NOW()) THEN RIGHT(hfin,2) ELSE 0 END) + 
        			SUM(CASE WHEN etat = ''TERMINE'' AND evenement.TypeEvenement = ''P1'' AND LEFT(hdebut,2) = HOUR(NOW()) THEN evenement.duree ELSE 0 END) + 
        			SUM(CASE WHEN etat = ''EN COURS'' AND evenement.TypeEvenement = ''P1'' AND LEFT(hdebut,2) = HOUR(NOW()) THEN 60 - RIGHT(hdebut,2) ELSE 0 END) + 
                    SUM(CASE WHEN etat = ''EN COURS'' AND evenement.TypeEvenement = ''P1'' AND LEFT(hdebut,2) <> HOUR(NOW()) THEN 60 ELSE 0 END) - 
                    SUM(CASE WHEN etat = ''TERMINE'' AND type_evenement.type_alea = ''Hors poste de travail'' AND LEFT(hfin,2) = HOUR(NOW()) THEN RIGHT(hfin,2) ELSE 0 END) - 
                    SUM(CASE WHEN etat = ''TERMINE'' AND type_evenement.type_alea = ''Hors poste de travail'' AND LEFT(hdebut,2) = HOUR(NOW()) THEN duree ELSE 0 END) - 
        			SUM(CASE WHEN etat = ''EN COURS'' AND type_evenement.type_alea = ''Hors poste de travail'' AND LEFT(hdebut,2) = HOUR(NOW()) THEN 60 - RIGHT(hdebut,2) ELSE 0 END) - 
                    SUM(CASE WHEN etat = ''EN COURS'' AND type_evenement.type_alea = ''Hors poste de travail'' AND LEFT(hdebut,2) <> HOUR(NOW()) THEN 60 ELSE 0 END) 
                    FROM lds.evenement 
                    LEFT JOIN lds.type_evenement ON evenement.TypeEvenement = type_evenement.typeEvenement
                    WHERE ofab = ''vof'' AND famille = ''vfamille'' AND SESA = ''vSESA'' AND str_to_date(date, ''%d/%c/%Y'') = DATE(NOW()))
                    WHERE ofab = ''vof'' AND famille = ''vfamille'' AND SESA = ''vSESA'' AND str_to_date(date, ''%d/%c/%Y'') = DATE(NOW()) AND type_donnee = ''OT'';';
        		set @SQLupdate = replace(@SQLupdate, 'NomColonne', (SELECT NomColonne));
                set @SQLupdate = replace(@SQLupdate, 'vof', (SELECT vof));
                set @SQLupdate = replace(@SQLupdate, 'vfamille', (SELECT vfamille));
                set @SQLupdate = replace(@SQLupdate, 'vSESA', (SELECT vSESA));
        		PREPARE stmt1 FROM @SQLupdate;
                execute stmt1;
                   
            
          SET i = i + 1;
        END WHILE;
        End


        Sinon dans l'application avec le Timer je passe plus par du VB (variables à 2 dimensions qui retient les itérations de la commande et de la personne et additionne en fonction d'un type d'évènement puis je fait l'update avec la valeur calculé en VB. 

        Benzouye a écrit:

        Mais, te connaissant un peu, que ce sera sûrement dur de te tirer les vers du nez pour comprendre ce que tu fais et ton modèle :D

         Je vais essayer de trouver les endroits de mon code qui pose le plus de problème avant. 

        Sinon il y a des outils pour analyser facilement les performances au niveaux des requêtes par exemple : nombre de select, insert, update qui sont lancé / temps d'execution... à l'appuis sur un bouton dans l'interface de l'application ?

        Edit : J'ai améliorer 2-3 partie de mon code et j'ai déjà l'impression que c'est 2 fois plus rapide 😊

        -
        Edité par DeveloSt 11 mars 2021 à 16:46:35

        • Partager sur Facebook
        • Partager sur Twitter

        Site Internet : https://devst.go.yj.fr

        MySQL, Problème de lenteur

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown