Bonjour,
je sollicite votre aide à propos d'une requête SQL que je trouve anormalement lente.
La requête est la suivante :
Cette requête prend en moyenne 30 secondes à s'exécuter.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT m.nom as magasin, p.reference, f.libelle FROM VENTE_LIGNE vl INNER JOIN VENTE v ON (v.vente_id = vl.vente_id AND v.date_vente = 20160801) INNER JOIN MAGASIN m ON (m.magasin_id = v.magasin_id) INNER JOIN PRODUIT p ON (vl.produit_id = p.produit_id) INNER JOIN FAMILLE f ON (f.famille_id = p.famille_id) INNER JOIN SOUS_RAYON s ON (s.sourayon_id = f.sourayon_id)
Si j'enlève la dernière jointure à la table SOUS_RAYON, ma requête prend moins d'une seconde.
J'ai beau chercher, impossible de comprendre pourquoi...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT m.nom as magasin, p.reference, f.libelle FROM VENTE_LIGNE vl INNER JOIN VENTE v ON (v.vente_id = vl.vente_id AND v.date_vente = 20160801) INNER JOIN MAGASIN m ON (m.magasin_id = v.magasin_id) INNER JOIN PRODUIT p ON (vl.produit_id = p.produit_id) INNER JOIN FAMILLE f ON (f.famille_id = p.famille_id)
La base de données est sous MySQL.
Il y a bien des clés étrangères (donc index) sur chaque ID.
Nombre de lignes par table : VENTE_LIGNE (10 000 000), VENTE (38 000), MAGASIN (40), PRODUIT (90 000), FAMILLE (140), SOUS_RAYON (60).
Détails du schéma avec les clés primaires soulignées, et les clés étrangères avec un # :
VENTE (vente_id)
VENTE_LIGNE (vente_ligne_id, #vente_id, #magasin_id, #produit_id)
MAGASIN (magasin_id)
PRODUIT (produit_id, #famille_id)
FAMILLE (famille_id, #sousrayon_id)
SOUS_RAYON (sourayon_id)
La différence entre les 2 requêtes est donc une jointure sur une table de 58 enregistrements.
Je comprends que cela multiplie les données à interroger mais cette différence de temps me parait énorme.
Remarque : ma requête originale est bien plus complexe mais je l'ai simplifiée au maximum pour une meilleure compréhension.
Merci de m'éclairer.
Partager