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

SQL Oracle Discussion :

Plusieurs liens sur une même table : problème de performance


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Par défaut Plusieurs liens sur une même table : problème de performance
    Bonjour,

    Je travaille sur une requête très simple: afficher les champs d'un fichier articles y compris les champs statistiques et ses libellés.

    Les libellés des champs stats sont dans une autre table: je dois donc lire la table statistiques autant de fois qu'il y a de champs de stats dans le fichier article. En l’occurrence: 6

    Nombre de liens (lecture) et performance:
    - 4 liens --> 11 s;
    - 5 liens --> 2 min
    - 6 liens --> time out (10 min)

    Est-ce qu'il y a une façon d'optimiser ma requête ?

    En vous remerciant

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Utiliser des jointures.

  3. #3
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Et fournir la structure des tables !

  4. #4
    Membre averti
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Par défaut
    Merci beaucoup pour vos réponses:

    --> J'ai fait la requête avec des liaisons.
    --> La structure de la clef (ci dessous):

    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
     
    INNER JOIN
    	PRODCTL.F0005	PRODCTL_F0005_1 ON
    	(APRODDTA___F4101_.IMSRP1 = SUBSTR(PRODCTL_F0005_1.DRKY,-3) AND	PRODCTL_F0005_1.DRSY = '41' AND 	PRODCTL_F0005_1.DRRT = 'S1')
     
    INNER JOIN
    	PRODCTL.F0005	PRODCTL_F0005_2 ON
    	(APRODDTA___F4101_.IMSRP2 = SUBSTR(PRODCTL_F0005_2.DRKY,-3) AND	PRODCTL_F0005_2.DRSY = '41' AND 	PRODCTL_F0005_2.DRRT = 'S2')
     
    INNER JOIN
    	PRODCTL.F0005	PRODCTL_F0005_3 ON
    	(APRODDTA___F4101_.IMSRP3 = SUBSTR(PRODCTL_F0005_3.DRKY,-3) AND	PRODCTL_F0005_3.DRSY = '41' AND 	PRODCTL_F0005_3.DRRT = 'S3')
     
    INNER JOIN
    	PRODCTL.F0005	PRODCTL_F0005_4 ON
    	(APRODDTA___F4101_.IMPRP1 = SUBSTR(PRODCTL_F0005_4.DRKY,-3) AND	PRODCTL_F0005_4.DRSY = '41' AND 	PRODCTL_F0005_4.DRRT = 'P1')
     
    INNER JOIN
    	PRODCTL.F0005	PRODCTL_F0005_5 ON
    	(APRODDTA___F4101_.IMPRP2 = SUBSTR(PRODCTL_F0005_5.DRKY,-3) AND	PRODCTL_F0005_5.DRSY = '41' AND 	PRODCTL_F0005_5.DRRT = 'P2')
     
    INNER JOIN
    	PRODCTL.F0005	PRODCTL_F0005_6 ON
    	(APRODDTA___F4101_.IMPRP3 = SUBSTR(PRODCTL_F0005_6.DRKY,-3) AND	PRODCTL_F0005_6.DRSY = '41' AND 	PRODCTL_F0005_6.DRRT = 'P3')

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Avec un CASE (ou un max(case...)) ça devrait être possible avec une seule jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select ...,
           case when PRODCTL_F0005_1.DRRT = 'S1' then ... end as s1_...
           case when PRODCTL_F0005_1.DRRT = 'S2' then ... end as s2_...
           ...
      from APRODDTA___F4101_
    INNER JOIN
    	PRODCTL.F0005	PRODCTL_F0005_1 ON APRODDTA___F4101_.IMSRP1 = SUBSTR(PRODCTL_F0005_1.DRKY,-3)
    where PRODCTL_F0005_1.DRSY = '41' 
      AND PRODCTL_F0005_1.DRRT in ('S1','S2','S3','P1','P2','P3')
    Par ailleurs il sera peut être intéressant de créer un index de fonction sur SUBSTR(PRODCTL.F0005,-3) peut être même couplé à DRSY.

  6. #6
    Membre averti
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Par défaut
    Merci pour la réponse.
    bonne idée le Case.

  7. #7
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Avec un CASE (ou un max(case...)) ça devrait être possible avec une seule jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select ...,
           case when PRODCTL_F0005_1.DRRT = 'S1' then ... end as s1_...
           case when PRODCTL_F0005_1.DRRT = 'S2' then ... end as s2_...
           ...
      from APRODDTA___F4101_
    INNER JOIN
    	PRODCTL.F0005	PRODCTL_F0005_1 ON APRODDTA___F4101_.IMSRP1 = SUBSTR(PRODCTL_F0005_1.DRKY,-3)
    where PRODCTL_F0005_1.DRSY = '41' 
      AND PRODCTL_F0005_1.DRRT in ('S1','S2','S3','P1','P2','P3')
    Par ailleurs il sera peut être intéressant de créer un index de fonction sur SUBSTR(PRODCTL.F0005,-3) peut être même couplé à DRSY.
    Il faut faire plus que cela - un group by au minimum, car les jointures sont cumulatives (il faut donc une ligne avec s1, une ligne avec s2, etc.).

  8. #8
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Si on pouvait avoir la requête complète, ça aiderait à proposer quelque chose. C'est difficile de proposer quoi que ce soit, on ne sait vraiment pas grand chose. Une idée des volumétries en jeu ? Avec un peu de répartition si possible.

    Un peu au pif au vu du peu d'informations, on pourrait tenter quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE INDEX IDX_TEST_PERF ON PRODCTL.F0005 (   SUBSTR(DRKY,-3) , DRSY, DRRT) )
    L'ordre des colonnes pourrait être modifié selon les volumétries. On pourrait aussi ajouter des colonnes à la fin pour éviter les accès à la table. Ou encore ré-écrire la requête en factorisant le parcours de la table, si on connaissait la structure et les contraintes de la table lues beaucoup de fois.

    Mais pour ça il faut plus d'informations !

Discussions similaires

  1. Plusieurs SUM sur une même table
    Par fbms18 dans le forum SQL
    Réponses: 6
    Dernier message: 29/04/2011, 09h45
  2. Réponses: 8
    Dernier message: 03/05/2010, 14h56
  3. Plusieurs trigger sur une même table / Performances
    Par tchoimars dans le forum PL/SQL
    Réponses: 2
    Dernier message: 27/01/2010, 15h58
  4. Suivi de plusieurs plans d'actions sur une même table
    Par Mac_yavel dans le forum Modélisation
    Réponses: 2
    Dernier message: 20/07/2007, 13h44
  5. [MySQL] Plusieurs même requetes sur une même table
    Par bibom dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 27/07/2006, 12h54

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