Partage
  • Partager sur Facebook
  • Partager sur Twitter

creer un vue

    4 mars 2022 à 11:07:42

    bonjour,

    j'ai une table 'addressing'

    CREATE TABLE `addressing` (
    	`ad_id` INT(11) NOT NULL AUTO_INCREMENT,
    	`ad_idTool` INT(11) NOT NULL,
    	`ad_idLocation` INT(11) NOT NULL,
    	`ad_addressing` CHAR(50) NOT NULL COLLATE 'utf8mb4_general_ci',
    	`ad_date` DATE NOT NULL,
    	PRIMARY KEY (`ad_id`) USING BTREE
    )

    Je voudrais créer un vue pour classer cette table, j'y suis arrivé avec beaucoup de mal mais la requête est très très longue :( la voici

    SELECT
    	A.ad_idTool,
    	
    	B.ad_addressing AS ad_1,
    	
    	C.ad_addressing AS ad_2,
    	
    	D.ad_addressing AS ad_3,
    	
    	E.ad_addressing AS ad_4
    	
    FROM `addressing` A
    
    LEFT JOIN `addressing` B
    	ON A.ad_idTool = B.ad_idTool AND B.ad_idLocation = 1
    	
    LEFT JOIN `addressing` C
    	ON A.ad_idTool = C.ad_idTool AND C.ad_idLocation = 2
    		
    LEFT JOIN `addressing` D
    	ON A.ad_idTool = D.ad_idTool AND D.ad_idLocation = 3
    
    LEFT JOIN `addressing` E
    	ON A.ad_idTool = E.ad_idTool AND E.ad_idLocation = 4
    	
    GROUP BY A.ad_idTool

    Je souhaite optimiser

    /* Lignes affectées: 0  Lignes trouvées: 1 371  Avertissements: 0  Durée pour 1 requête: 0,735 s. (+ 4,187 s. réseau) */


    Merci de votre aide


    -
    Edité par Sairus95 4 mars 2022 à 17:58:38

    • Partager sur Facebook
    • Partager sur Twitter
      4 mars 2022 à 15:12:05

      Bonjour,

      Sairus95 a écrit:

      la requête est très très longue

      Durée pour 1 requête: 0,735 s. (+ 4,187 s. réseau)

      0.7s ce n'est pas "très très long" ... c'est ton ping réseau de 4s qui est énorme, rien à voir avec la requête ...

      Sinon, as-tu un index sur la colonne addressing.ad_idLocation ? Pas de foreign key sur id_tool ? Donc pas d'index non plus ?

      Perso je ferai plutôt ainsi :

      SELECT DISTINCT
      	A.ad_idTool,
      	B.ad_idLocation,
      	B.ad_addressing
      FROM
      	addressing A
      		INNER JOIN addressing B
      			ON A.ad_idTool = B.ad_idTool

      Au lieu d'avoir une ligne avec 4 colonnes, plutôt 4 lignes ...

      Et au passage, on n'utilise pas GROUP BY sans fonction d'agrégation (SUM, COUNT, AVG, etc.). Pour supprimer les doublons c'est DISTINCT ...

      -
      Edité par Benzouye 4 mars 2022 à 15:12:49

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        4 mars 2022 à 18:06:38

        Voici la table addressing en entier

        CREATE TABLE `addressing` (
        	`ad_id` INT(11) NOT NULL AUTO_INCREMENT,
        	`ad_idTool` INT(11) NOT NULL,
        	`ad_idLocation` INT(11) NOT NULL,
        	`ad_addressing` CHAR(50) NOT NULL COLLATE 'utf8mb4_general_ci',
        	`ad_date` DATETIME NOT NULL,
        	PRIMARY KEY (`ad_id`) USING BTREE,
        	INDEX `FK_ad_idLocation` (`ad_idLocation`) USING BTREE,
        	CONSTRAINT `FK_ad_idLocation` FOREIGN KEY (`ad_idLocation`) REFERENCES `demo`.`io.location` (`lo_id`) ON UPDATE RESTRICT ON DELETE RESTRICT
        )
        COMMENT='ADRESSAGE DES OUTILS'
        COLLATE='utf8mb4_general_ci'
        ENGINE=InnoDB
        AUTO_INCREMENT=130
        ;

         le probleme j'ai une requete voir ci-desous

        SELECT DISTINCT
        			a.to_id,
        			a.to_idProvider,
        			a.to_idLastUser,
        			a.to_idMaterial,
        			a.to_idMaterialS,
        			a.to_idCode,
        			a.to_dc,
        			a.to_dmm,
        			a.to_re,
        			a.to_chw,
        			a.to_pcedc,
        			a.to_apmxs,
        			a.to_ln,
        			a.to_oal,
        			a.to_ccc,
        			a.to_icc,
        			a.to_tap,
        			a.to_tapStep,
        			a.to_reference,
        			a.to_barcode,
        			a.to_providerUrl,
        			a.to_grade,
        			a.to_date,
        
        			S1.NB_stock_tool_total AS NB_stock_1,
        			S2.NB_stock_tool_total AS NB_stock_2,
        			S3.NB_stock_tool_total AS NB_stock_3,
        			S4.NB_stock_tool_total AS NB_stock_4,
        
        			A1.ad_addressing AS addressing_1,
        			A2.ad_addressing AS addressing_2,
        			A3.ad_addressing AS addressing_3,
        			A4.ad_addressing AS addressing_4,
        
        			L1.lo_location AS lo_1,
        			L2.lo_location AS lo_2,
        			L3.lo_location AS lo_3,
        			L4.lo_location AS lo_4,
        
        			e.mg_id,
        			e.mg_category,
        			e.mg_iso,
        
        			f.pr_id,
        			f.pr_provider,
        
        			g.us_id,
        			g.us_name,
        			g.us_lastname,
        			g.us_idLocation,
        
        			h.lo_id,
        			h.lo_location,
        
        			k.cd_code,
        			k.cd_codeInfo
        
        		FROM
        			`tool` a
        				LEFT JOIN `user` g
        					ON g.us_id = a.to_idLastUser
        				LEFT JOIN `location` h
        					ON h.lo_id = g.us_idLocation
        				LEFT JOIN `materialGroup` e
        					ON e.mg_id = a.to_idMaterial
        				LEFT JOIN `provider` f
        					ON f.pr_id = a.to_idProvider
        				LEFT JOIN `code` k
        					ON k.cd_id = a.to_idCode
        
        				LEFT JOIN v_stock_tool_total S1
        					ON a.to_id = S1.st_idTool
        					AND S1.st_stock = 1
        				LEFT JOIN v_stock_tool_total S2
        					ON a.to_id = S2.st_idTool
        					AND S2.st_stock = 2
        				LEFT JOIN v_stock_tool_total S3
        					ON a.to_id = S3.st_idTool
        					AND S3.st_stock = 3
        				LEFT JOIN v_stock_tool_total S4
        					ON a.to_id = S4.st_idTool
        					AND S4.st_stock = 4
        
        				LEFT JOIN addressing A1
        					ON a.to_id = A1.ad_idTool
        					AND A1.ad_idLocation = 1
        				LEFT JOIN addressing A2
        					ON a.to_id = A2.ad_idTool
        					AND A2.ad_idLocation = 2
        				LEFT JOIN addressing A3
        					ON a.to_id = A3.ad_idTool
        					AND A3.ad_idLocation = 3
        				LEFT JOIN addressing A4
        					ON a.to_id = A4.ad_idTool
        					AND A4.ad_idLocation = 4
        
        				LEFT JOIN location L1
        					ON L1.lo_id = 1
        				LEFT JOIN location L2
        					ON L2.lo_id = 2
        				LEFT JOIN location L3
        					ON L3.lo_id = 3
        				LEFT JOIN location L4
        					ON L4.lo_id = 4
        		WHERE
        			a.to_archive = 0
        		ORDER BY a.to_id DESC

        quand je retire la partie addressing ma requete est 4 fois plus rapide voila pourquoi je voulais créer une vue qui me permettra d'optimiser cette requete



        -
        Edité par Sairus95 4 mars 2022 à 18:29:18

        • Partager sur Facebook
        • Partager sur Twitter

        creer un vue

        × 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