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

Requêtes MySQL Discussion :

Probleme de requête SQL trop longue


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 39
    Points : 28
    Points
    28
    Par défaut Probleme de requête SQL trop longue
    Bonjour,

    Je viens faire appel aux talents de développez.com car je me casse les dents sur une requête sans réussir à la rendre satisfaisante.

    Pour expliquer le problème:
    1/ J'ai une table affaire qui possède un champs responsable.
    2/ La table affaire possède un champs fk_departement. Par une jointure sur departement et sur secteur, on peux connaître le directeur du secteur.
    3/ Je possède aussi une table affaire_user qui contient des couples fk_affaire et fk_user. Qui permet d'ouvrir des droits sur l'affaire à un user lambda.

    Je veux créer pour un utilisateur donnée un écran de l'ensemble des affaires dont il a accès ( soit il en est le responsable, soit le directeur du secteur de l'affaire, soit cité sur l'affaire).

    Voici ce que j'ai pondu comme requête mais elle met de 15 à 30 secondes avant de donner une réponse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT a.ref
    FROM   ( llx_affaire as affaire
    LEFT JOIN llx_affaire_user AS au ON affaire.rowid = au.fk_affaire ), llx_departement AS dep, llx_secteur AS secteur
    WHERE affaire.fk_departement = dep.rowid
    AND dep.secteur = secteur.rowid
    AND (
    au.fk_user =64
    OR a.fk_responsable =64
    OR secteur.fk_directeur =64
    )
    Pour info,
    llx_affaire contient 6000 lignes.
    llx_affaire_user contient 20 000 lignes.
    llx_departement contient 20 lignes.
    llx_secteur contient 6 lignes.


    Merci d'avance de vos réponses et de votre aide.

    Maximilien

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Je n'arrive pas bien à démêler ton code SQL qui mélange la syntaxe de jointure normalisée avec des jointures par clause WHERE.
    Je vais essayer de reformuler cela en SQL normalisé.
    @+

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Tu as un alias 'a' qui ne correspond à aucune table. Je suppose qu'il s'agit de llx_affaire ?

    Les alias sont faits pour simplifier et alléger le texte des requêtes. Mettre un alias 'secteur' à la place de llx_secteur n'apporte pas grand chose !

    Tu mélanges la syntaxe obsolète depuis 1992 pour les jointures (FROM WHERE) avec la syntaxe normalisée (JOIN).

    Choisis le bon camp camarade ! Adopte la jointure normalisée !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT a.ref
    FROM llx_affaire AS a
    LEFT JOIN llx_affaire_user AS au ON a.rowid = au.fk_affaire 
    INNER JOIN llx_departement AS dep ON a.fk_departement = dep.rowid
      INNER JOIN llx_secteur AS s ON dep.secteur = s.rowid
    WHERE au.fk_user = 64
      OR a.fk_responsable = 64
      OR s.fk_directeur = 64
    Ton besoin :
    Je veux créer pour un utilisateur donné un écran de l'ensemble des affaires dont il a accès ( soit il en est le responsable, soit le directeur du secteur de l'affaire, soit cité sur l'affaire).
    Ta requête me semble bonne.

    Les tables sont-elles bien indexées ?
    Il faut indexer les clés étrangères.

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Je pense que ça devrait aller mieux comme ça
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT aff.ref
    FROM  llx_affaire AS aff
    LEFT JOIN llx_affaire_user AS au 
        ON aff.rowid = au.fk_affaire
    INNER JOIN llx_departement AS dep
        ON aff.fk_departement = dep.rowid
    INNER JOIN llx_secteur AS sect
        ON dep.secteur = sect.rowid
    WHERE  au.fk_user = 64
        OR aff.fk_responsable = 64
        OR secteur.fk_directeur = 64
    Mais bien sûr les conseils d'indexation de Cinephil ne sont pas superflus.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    Merci beaucoup de vos réponses.

    Vous avez bien identifiés les problèmes.
    L'indexation des champs + les jointures normalisées = résultat immédiat de la requête.

    Encore une fois merci, les qualités des réponses de developpez.com sont réellement de bonnes qualités.

    Bon WE à tous

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

Discussions similaires

  1. [WD17] Performance interface, requête sql trop longue, inutilisable.
    Par droliprane dans le forum WinDev
    Réponses: 28
    Dernier message: 08/09/2015, 12h04
  2. [Débutant] Requête SQL Trop longue
    Par Avatar69 dans le forum C#
    Réponses: 3
    Dernier message: 14/05/2013, 18h26
  3. Temps d'exécution requête SQL trop Longue
    Par farouk1301 dans le forum JDBC
    Réponses: 7
    Dernier message: 09/08/2012, 20h25
  4. [MySQL] Interrompre une requête sql trop longue
    Par kayoum dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 30/05/2011, 14h00
  5. [Requête SQL]Trop longue pour une ligne
    Par jbulysse dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/07/2008, 14h27

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