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 :

Optimisation Req INDEX


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 41
    Points : 31
    Points
    31
    Par défaut Optimisation Req INDEX
    Bonjour,

    Je suis face a un problème au quel je ne trouve pas de solution,

    Je suis sous Oracle 10g r2 et j'ai des requêtes qui s'exécutent et qui prennent un temps fou
    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
     
    SELECT T0.object_id, T0.u7e_fr_s_lastmodifier, T0.u79_fr_s_uocode, T0.u63_fr_s_operationid, T0.u7b_fr_s_customername, T0.u65_fr_n_businessid, T0.u81_fr_s_linkedvisionreference, T0.u70_fr_t_completiondate, T0.u71_fr_t_donedate, T0.doc_state
    FROM (SELECT * FROM DocVersion 
    		WHERE (object_class_id IN (:1, :2, :3) OR object_class_id IS NULL) 
    			AND home_id IS NULL) T0 
     
    	LEFT JOIN (SELECT * FROM Generic 
    		WHERE (object_class_id IN (:4) OR object_class_id IS NULL) 
    			AND home_id IS NULL) T1 ON T0.u68_refoperationproduct = T1.object_id 
    	LEFT JOIN (SELECT * FROM Generic 
    		WHERE (object_class_id IN (:5) OR object_class_id IS NULL) 
    			AND home_id IS NULL) T2 ON T0.u65_fr_n_businessid = T2.u4f_fr_n_businessid 
    		WHERE (( ( T0.doc_state <> :6 
    					AND T0.u65_fr_n_businessid IN ( :7, :8, :9) 
    					AND T1.u2b_fr_n_mo = :12 
    					AND T0.u79_fr_s_uocode IN ( :13, :14, :15)
     
    					))) 
     
     
    ORDER BY  T0.u7b_fr_s_customername ASC,  T2.u50_fr_s_productgroup ASC,  T2.u51_fr_s_product ASC,  T1.object_id ASC,  T2.u52_fr_s_transaction ASC,  T0.u6a_fr_t_initiateddate DESC,  T0.object_id ASC,  T2.object_id ASC
    Le Coup de la requête est de 264172 à mon avis dû aux différents JOIN, ci-joint en plan d'exécution

    Quelqu'un aurait une suggestion ??

    Merci pour votre aide

    Cdt
    Images attachées Images attachées  

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    A quoi sert la première jointure externe t0-t1 ?
    Dans la clause where il y a une restriction sur un champ de t1 (= donc not null)

    Il faut aussi remplacer les IN (:X) par = :X

    Peut être passer les lignes de la clause where de T0 dans la sousrequete () T0 ou inversement enlever le ()T0 et mettre la table DocVersion, puis toutes les conditions regroupées.

    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
    SELECT T0.object_id, T0.u7e_fr_s_lastmodifier, T0.u79_fr_s_uocode, T0.u63_fr_s_operationid, T0.u7b_fr_s_customername, 
    				T0.u65_fr_n_businessid, T0.u81_fr_s_linkedvisionreference, T0.u70_fr_t_completiondate, T0.u71_fr_t_donedate, T0.doc_state
    FROM DocVersion T0
    	JOIN (SELECT * FROM GENERIC 
    			WHERE (object_class_id =:4 OR object_class_id IS NULL) 
    			AND home_id IS NULL) T1 
             ON T0.u68_refoperationproduct = T1.object_id 
    	LEFT JOIN (SELECT * FROM GENERIC 
    			WHERE (object_class_id =:5 OR object_class_id IS NULL) 
    			AND home_id IS NULL) T2 
            ON T0.u65_fr_n_businessid = T2.u4f_fr_n_businessid 
    WHERE (t0.object_class_id IN (:1, :2, :3) OR object_class_id IS NULL) 
    AND t0.home_id IS NULL
    AND T0.doc_state <> :6 
    AND T0.u65_fr_n_businessid IN ( :7, :8, :9) 
    AND T0.u79_fr_s_uocode IN ( :13, :14, :15)
    AND T1.u2b_fr_n_mo = :12
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Bonjour
    Merci pour votre réponse,
    le souci c'est que la requête est construite de manière intuitive par un autre outil (PE, Filenet) donc nous n'avons pas la possibilité de modifier le contenu des sous requêtes

    et en regardant toutes les requetes lancées, la bête noire est le OUTER JOIN de Docversion

    !!!

  4. #4
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Un plan d’exécution incomplet ne sert à rien, ce n’est pas la peine de l’afficher.
    Vos jointures existent seulement pour l’Order By
    Et si mon impression que vous avez un sort de modèle (super) générique est juste, vous est dans un monde de douleur.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Veuillez m'excuser pour le Plan d'exécution incomplet je me suis rendu compte que je m'étais trompé de fichier , vous trouverez ci-joint le fichier .html correspondant a l'exécution d'une requête.

    la seule chose que je peux toucher est la création d'indexes, impossible de toucher à la structure de la requête

    merci pour l'aide
    Fichiers attachés Fichiers attachés

  6. #6
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Donc vous ne pouvez pas modifier vos requêtes!
    Pourriez-vous exécuter et poster le résultat ?
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    set serveroutput off
    SELECT /*+ gather_plan_statistics */ T0.object_id,
           T0.u7e_fr_s_lastmodifier,
           T0.u79_fr_s_uocode,
           T0.u63_fr_s_operationid,
           T0.u7b_fr_s_customername,
           T0.u65_fr_n_businessid,
           T0.u81_fr_s_linkedvisionreference,
           T0.u70_fr_t_completiondate,
           T0.u71_fr_t_donedate,
           T0.doc_state
      FROM (SELECT *
              FROM DocVersion
             WHERE (object_class_id IN (:1, :2, :3) OR object_class_id IS NULL)
               AND home_id IS NULL) T0
      LEFT JOIN (SELECT *
                   FROM Generic
                  WHERE (object_class_id IN (:4) OR object_class_id IS NULL)
                    AND home_id IS NULL) T1 ON T0.u68_refoperationproduct =
                                               T1.object_id
      LEFT JOIN (SELECT *
                   FROM Generic
                  WHERE (object_class_id IN (:5) OR object_class_id IS NULL)
                    AND home_id IS NULL) T2 ON T0.u65_fr_n_businessid =
                                               T2.u4f_fr_n_businessid
     WHERE (((T0.doc_state <> :6 AND T0.u65_fr_n_businessid IN (:7, :8, :9) AND
           T1.u2b_fr_n_mo = :12 AND T0.u79_fr_s_uocode IN (:13, :14, :15)
     
           )))
     ORDER BY T0.u7b_fr_s_customername  ASC,
              T2.u50_fr_s_productgroup  ASC,
              T2.u51_fr_s_product       ASC,
              T1.object_id              ASC,
              T2.u52_fr_s_transaction   ASC,
              T0.u6a_fr_t_initiateddate DESC,
              T0.object_id              ASC,
              T2.object_id              ASC
    /
    select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'))
    /

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    Oui, On ne peut absolument pas toucher la structure de la requête étant donné qu'elle est générée automatiquement par le Process Engine de Filenet

    J'ai exécuté la requête que vous m'avez donné avec un petit jeu d'essai, vous trouverez en pièce jointe le plan d'exécution correspondant.

    Merci beaucoup pour votre aide
    Fichiers attachés Fichiers attachés

  8. #8
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Il y a une erreur importante dans l’estimation des cardinalités de la table GENERIC (E(stimated)-Rows 277 K vers A(ctual)-Rows 0). Vérifiez (régénérez) les statistiques. Mais il me semble que requêtes s’exécute en environ 4 secondes ce qui n’est pas forcement un temps fou, sauf bien sûr si elle s’exécute un nombre important de fois.

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je pense que vous avez raté ceci mnitu :
    avec un petit jeu d'essai

  10. #10
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    @Waldar. C'est vrai, vous avez raison.
    Donc il faut la requête exécutée sur l'environement où ça pose des problèmes.

  11. #11
    Membre actif Avatar de Ahmed AANGOUR
    Homme Profil pro
    DBA Oracle
    Inscrit en
    Janvier 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle

    Informations forums :
    Inscription : Janvier 2010
    Messages : 139
    Points : 271
    Points
    271
    Par défaut
    Si vous ne pouvez pas modifier la requête et si vous avez la licence Tuning Pack vous pouvez tenter de soumettre la requête au tuning advisor et voir ce qu'il vous propose. Un sql profile pourrait peut être faire l'affaire.

Discussions similaires

  1. Optimisation des index
    Par aldo-tlse dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/02/2010, 23h54
  2. Optimisation par index?
    Par Niak74 dans le forum SQLite
    Réponses: 7
    Dernier message: 10/12/2009, 11h02
  3. Réponses: 19
    Dernier message: 31/01/2008, 20h01
  4. Placement et optimisation d'indexes
    Par Evocatii dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/08/2007, 08h52
  5. Optimisation BDD Index etc..
    Par mediateur59 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 20/10/2006, 11h23

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