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

Toad Oracle Discussion :

Comprendre un plan d'exécution sous Toad


Sujet :

Toad Oracle

  1. #1
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 101
    Points : 118
    Points
    118
    Par défaut Comprendre un plan d'exécution sous Toad
    Bonjour à tous,

    Déjà pour vous situer mon niveau, je suis proche du néophyte sous toad. Donc la tâche s'annonce hard, surtout quand on me demande d'analyser des requêtes dont les temps d'exécution sont très longues pour très peu de données en retour.

    Donc on m'a demandé de lancer un plan d'exécution d'une requête ... je cherche, et je trouve la commande EXPLAIN, puis je regarde ce que je peux faire avec :

    je lance le plan, et j'obtiens (attention c'est du copier / coller) ce plan (non complet pour des raisons de confidentialité):

    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
    42
    43
    44
    45
     
    SELECT STATEMENT  ALL_ROWSCost: 13,090  Bytes: 22,862,909  Cardinality: 70,783  										
    	96 FILTER  									
    		18 HASH JOIN RIGHT SEMI  Cost: 13,090  Bytes: 86,304,631  Cardinality: 267,197  								
    			3 PARTITION LIST SINGLE  Cost: 1,670  Bytes: 8,222,794  Cardinality: 115,814  Partition #: 3  Partitions accessed #2							
    				2 PARTITION LIST SINGLE  Cost: 1,670  Bytes: 8,222,794  Cardinality: 115,814  Partition #: 4  						
    					1 TABLE ACCESS FULL TABLE DRS.DRS_FAITS_INCD_BL Cost: 1,670  Bytes: 8,222,794  Cardinality: 115,814  Partition #: 5  Partitions accessed #26					
    			17 HASH JOIN  Cost: 9,422  Bytes: 136,882,872  Cardinality: 543,186  							
    				13 PART JOIN FILTER CREATE SYS.:BF0000 Cost: 5,690  Bytes: 16,622,775  Cardinality: 85,245  						
    					12 HASH JOIN  Cost: 5,690  Bytes: 16,622,775  Cardinality: 85,245  					
    						8 HASH JOIN  Cost: 3,757  Bytes: 21,355,012  Cardinality: 155,876  				
    							5 PARTITION LIST SINGLE  Cost: 16  Bytes: 18,124  Cardinality: 197  Partition #: 10  Partitions accessed #2			
    								4 TABLE ACCESS FULL TABLE RDWH.HIERARCHIE Cost: 16  Bytes: 18,124  Cardinality: 197  Partition #: 11  Partitions accessed #2		
    							7 PARTITION LIST SINGLE  Cost: 3,666  Bytes: 99,003,600  Cardinality: 2,200,080  Partition #: 12  Partitions accessed #2			
    								6 TABLE ACCESS FULL TABLE DCL.DCL_PROFIL_ENT_TIT Cost: 3,666  Bytes: 99,003,600  Cardinality: 2,200,080  Partition #: 13  Partitions accessed #2		
    						11 PARTITION LIST SINGLE  Cost: 471  Bytes: 69,784,440  Cardinality: 1,203,180  Partition #: 14  Partitions accessed #2				
    							10 PARTITION LIST SINGLE  Cost: 471  Bytes: 69,784,440  Cardinality: 1,203,180  Partition #: 15  			
    								9 INDEX FAST FULL SCAN INDEX DRS.PK_DRS_FAITS_ET_SRF_FNN Cost: 471  Bytes: 69,784,440  Cardinality: 1,203,180  Partition #: 16  Partitions accessed #26		
    				16 PARTITION LIST SINGLE  Cost: 1,665  Bytes: 110,344,305  Cardinality: 1,935,865  Partition #: 17  Partitions accessed #2						
    					15 PARTITION LIST SINGLE  Cost: 1,665  Bytes: 110,344,305  Cardinality: 1,935,865  Partition #: 18  Partitions accessed #KEY(AP)					
    						14 TABLE ACCESS FULL TABLE DRS.DRS_FAITS_INCD_BL Cost: 1,665  Bytes: 110,344,305  Cardinality: 1,935,865  Partition #: 19  Partitions accessed #26				
    		22 PARTITION LIST SINGLE  Cost: 21  Bytes: 71  Cardinality: 1  Partition #: 20  Partitions accessed #2								
    			21 PARTITION LIST SINGLE  Cost: 21  Bytes: 71  Cardinality: 1  Partition #: 21  							
    				20 TABLE ACCESS BY LOCAL INDEX ROWID TABLE DRS.DRS_FAITS_INCD_BL Cost: 21  Bytes: 71  Cardinality: 1  Partition #: 22  Partitions accessed #26						
    					19 INDEX RANGE SCAN INDEX DRS.PK_DRS_FAITS_INCD_BL Cost: 3  Cardinality: 1  Partition #: 23  Partitions accessed #26					
    		26 PARTITION LIST SINGLE  Cost: 21  Bytes: 71  Cardinality: 1  Partition #: 24  Partitions accessed #2								
    			25 PARTITION LIST SINGLE  Cost: 21  Bytes: 71  Cardinality: 1  Partition #: 25  							
    				24 TABLE ACCESS BY LOCAL INDEX ROWID TABLE DRS.DRS_FAITS_INCD_BL Cost: 21  Bytes: 71  Cardinality: 1  Partition #: 26  Partitions accessed #26						
    					23 INDEX RANGE SCAN INDEX DRS.PK_DRS_FAITS_INCD_BL Cost: 3  Cardinality: 1  Partition #: 27  Partitions accessed #26					
    		42 FILTER  								
    			41 HASH GROUP BY  Cost: 4,617  Bytes: 323  Cardinality: 1  							
    				40 HASH JOIN  Cost: 4,616  Bytes: 323  Cardinality: 1  						
    					38 FILTER  					
    						37 HASH JOIN OUTER  Cost: 4,612  Bytes: 257  Cardinality: 1  				
    							33 HASH JOIN  Cost: 2,844  Bytes: 10,153,975  Cardinality: 51,025  			
    								29 PARTITION LIST SINGLE  Cost: 1,665  Bytes: 1,439,502  Cardinality: 16,546  Partition #: 34  Partitions accessed #2		
    									28 PARTITION LIST SINGLE  Cost: 1,665  Bytes: 1,439,502  Cardinality: 16,546  Partition #: 35  	
    										27 TABLE ACCESS FULL TABLE DRS.DRS_FAITS_INCD_BL Cost: 1,665  Bytes: 1,439,502  Cardinality: 16,546  Partition #: 36  Partitions accessed #26
    								32 PARTITION LIST SINGLE  Cost: 1,130  Bytes: 157,477,600  Cardinality: 1,406,050  Partition #: 37  Partitions accessed #2		
    									31 PARTITION LIST SINGLE  Cost: 1,130  Bytes: 157,477,600  Cardinality: 1,406,050  Partition #: 38  	
    										30 TABLE ACCESS FULL TABLE DRS.DRS_BL Cost: 1,130  Bytes: 157,477,600  Cardinality: 1,406,050  Partition #: 39  Partitions accessed #126
    							36 PARTITION LIST SINGLE  Cost: 471  Bytes: 69,784,440  Cardinality: 1,203,180  Partition #: 40  Partitions accessed #2			
    								35 PARTITION LIST SINGLE  Cost: 471  Bytes: 69,784,440  Cardinality: 1,203,180  Partition #: 41  		
    									34 INDEX FAST FULL SCAN INDEX DRS.PK_DRS_FAITS_SRF_FNN Cost: 471  Bytes: 69,784,440  Cardinality: 1,203,180  Partition #: 42  Partitions accessed #26	
    					39 TABLE ACCESS FULL TABLE DRS.SUIV_RISQ ..
    D'après ce que j'ai compris, et ce qu'on m'a dit, quand on voit TABLE ACCESS FULL TABLE, ça signifie que la requête récupère toutes les lignes de la table...
    Pour info, certaines tables, contient plus de 500 M de lignes
    Autre info, la requête analysée, contient des sous sous sous sous sous requêtes (pour un total de 7 sous requêtes)

    Dites moi, si avec les éléments donnés, vous pouvez m'aider à comprendre le plan d'exécution, et quelles combines pourrais je mettre en place pour réduire le temps d'exécution de la requête (sans intervenir sur la base, car pas les droits, mais en intervenant sur le SQL)

    Merci d'avance.

  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
    Je pense que c'est dur de pouvoir expliquer comment intervenir sur le sql sans avoir la requête.

    Pour lire le plan, il faut commencer par le n°1 (1 TABLE ACCESS FULL TABLE DRS.DRS_FAITS_INCD_BL Cost: 1,670), puis suivre étape par étape pour voir comment Oracle exécute la requête.

    Un table access full indique généralement un manque d'index, ou des stats pas à jour.
    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
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 101
    Points : 118
    Points
    118
    Par défaut
    Alors voilà la requête :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
     
    SELECT
      DRIS_FAITS_INCD_BALE2_personne.NUMR_PERS,
      RDWH_EDS_HIERARCHIE_GERE.DESG_COUR_EDS
    FROM
      DRIS_FAITS_INCD_BALE2  DRIS_FAITS_INCD_BALE2_personne,
      RDWH_EDS_HIERARCHIE  RDWH_EDS_HIERARCHIE_GERE,
      DCLI_PROFIL_ENT_TIT,
      DRIS_FAITS_ET_SURF_FINN
    WHERE
      ( DRIS_FAITS_ET_SURF_FINN.NUMR_ENTT_TITL=DCLI_PROFIL_ENT_TIT.NUMR_ENTT_TITL(+)  )
      AND  ( DCLI_PROFIL_ENT_TIT.EDS_EXTR_GERE_PAR=RDWH_EDS_HIERARCHIE_GERE.IDNT_EXTR_EDS(+)
    and
    DCLI_PROFIL_ENT_TIT.TYPE_EDS_GERE_PAR=RDWH_EDS_HIERARCHIE_GERE.TYPE_ELMT_STRC(+)
    and 
    RDWH_EDS_HIERARCHIE_GERE.TYPE_ORGN(+)='002'  )
      AND  ( DRIS_FAITS_INCD_BALE2_personne.NUMR_PERS=DRIS_FAITS_ET_SURF_FINN.NUMR_PERS(+) and DRIS_FAITS_INCD_BALE2_personne.PERD_ARRT_INFO=DRIS_FAITS_ET_SURF_FINN.PERD_ARRT_INFO(+) and DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD='P'  )
      AND  ( DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P'  )
      AND  (
      DRIS_FAITS_INCD_BALE2_personne.PERD_ARRT_INFO  =  @variable('Période d''Arrêté (AAAAMM) ?')  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P')
      AND  DRIS_FAITS_INCD_BALE2_personne.NUMR_PERS  IN  (SELECT
      DRIS_FAITS_INCD_BALE2_personne.NUMR_PERS
    FROM
      DRIS_FAITS_INCD_BALE2  DRIS_FAITS_INCD_BALE2_personne
    WHERE
    ( DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P'  )
      AND  (
      DRIS_FAITS_INCD_BALE2_personne.PERD_ARRT_INFO  =  @variable('Période d''Arrêté (AAAAMM) ?')  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P')
      AND  DRIS_FAITS_INCD_BALE2_personne.CODE_STTT_INCD  =  '1'  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P')
      AND  DRIS_FAITS_INCD_BALE2_personne.CODE_TYPE_INCD  IN  ('90', '9A', '9B', '9C', '9D', '9E', '9F')  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P')
      )
    )  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P')
      AND  (DRIS_FAITS_INCD_BALE2_personne.NUMR_PERS  IN  (SELECT
      DRIS_FAITS_INCD_BALE2_personne.NUMR_PERS
    FROM
      DRIS_FAITS_INCD_BALE2  DRIS_FAITS_INCD_BALE2_personne
    WHERE
    ( DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P'  )
      AND  (
      DRIS_FAITS_INCD_BALE2_personne.PERD_ARRT_INFO  =  @variable('Période d''Arrêté (AAAAMM) ?')  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P')
      AND  DRIS_FAITS_INCD_BALE2_personne.CODE_STTT_INCD  =  '1'  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P')
      AND  DRIS_FAITS_INCD_BALE2_personne.CODE_TYPE_INCD  IN  ('29', '30', '32', '38', '48', '49', '68', '69', '85', '86', '87')  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P')
      )
    )  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P')
      OR   DRIS_FAITS_INCD_BALE2_personne.NUMR_PERS  IN  (SELECT
      DRIS_FAITS_INCD_BALE2_contrat.NUMR_PERS
    FROM
      DRIS_FAITS_INCD_BALE2  DRIS_FAITS_INCD_BALE2_contrat
    WHERE
    ( DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C'  )
      AND  (
      DRIS_FAITS_INCD_BALE2_contrat.PERD_ARRT_INFO  =  @variable('Période d''Arrêté (AAAAMM) ?')  AND  (DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C')
      AND  DRIS_FAITS_INCD_BALE2_contrat.CODE_STTT_INCD  =  '1'  AND  (DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C')
      AND  DRIS_FAITS_INCD_BALE2_contrat.CODE_TYPE_INCD  IN  ('65', '79', '84', '88')  AND  (DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C')
      )
    )  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P')
      OR   DRIS_FAITS_INCD_BALE2_personne.NUMR_PERS  IN  (SELECT
      DRIS_FAITS_INCD_BALE2_personne.NUMR_PERS
    FROM
      DRIS_FAITS_INCD_BALE2  DRIS_FAITS_INCD_BALE2_personne,
      DRIS_BALE2,
      DRIS_TT_SEGM_SUIV_RISQ  DRIS_TT_SEGM_SUIV_RISQ_pers,
      DRIS_FAITS_ET_SURF_FINN
    WHERE
      ( DRIS_BALE2.CODE_SEGM_RISQ_PERS=DRIS_TT_SEGM_SUIV_RISQ_pers.CODE_NIV5(+)  )
      AND  ( DRIS_FAITS_INCD_BALE2_personne.NUMR_PERS=DRIS_FAITS_ET_SURF_FINN.NUMR_PERS(+) and DRIS_FAITS_INCD_BALE2_personne.PERD_ARRT_INFO=DRIS_FAITS_ET_SURF_FINN.PERD_ARRT_INFO(+) and DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD='P'  )
      AND  ( ((DRIS_BALE2.CODE_TYPE_ORGN_PRDT='CARTB' and 
    DRIS_BALE2.PERD_ARRT_INFO=DRIS_FAITS_ET_SURF_FINN.PERD_ARRT_INFO and 
      DRIS_BALE2.NUMR_ENTT_TITL=DRIS_FAITS_ET_SURF_FINN.NUMR_ENTT_TITL ) or
       ( DRIS_BALE2.CODE_TYPE_ORGN_PRDT<>'CARTB' and DRIS_BALE2.PERD_ARRT_INFO=DRIS_FAITS_ET_SURF_FINN.PERD_ARRT_INFO and 
      DRIS_BALE2.NUMR_PERS=DRIS_FAITS_ET_SURF_FINN.NUMR_PERS and DRIS_BALE2.NUMR_ENTT_TITL=DRIS_FAITS_ET_SURF_FINN.NUMR_ENTT_TITL  ))
      )
      AND  ( DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P'  )
      AND  ( DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P'  )
      AND  (
      DRIS_FAITS_INCD_BALE2_personne.PERD_ARRT_INFO  =  @variable('Période d''Arrêté (AAAAMM) ?')  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P')
      AND  DRIS_FAITS_INCD_BALE2_personne.CODE_TYPE_INCD  =  '46'  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P')
      AND  DRIS_FAITS_INCD_BALE2_personne.CODE_STTT_INCD  =  '1'  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P')
      AND  DRIS_BALE2.PERD_ARRT_INFO  =  @variable('Période d''Arrêté (AAAAMM) ?')
      AND  DRIS_BALE2.NUMR_PERS  =  DRIS_FAITS_INCD_BALE2_personne.NUMR_PERS
      AND  DRIS_TT_SEGM_SUIV_RISQ_pers.LIBL_NIV2  !=  'PART'
      )
    GROUP BY
      DRIS_FAITS_INCD_BALE2_personne.NUMR_PERS
    HAVING
      ( 
      SUM(CASE 
         WHEN DRIS_FAITS_INCD_BALE2_personne.CODE_STTT_INCD = '1' THEN LAST_DAY(TO_DATE(DRIS_FAITS_INCD_BALE2_personne.PERD_ARRT_INFO, 'YYYYMM')) - DRIS_FAITS_INCD_BALE2_personne.DATE_DEBU_VALD 
    ELSE DRIS_FAITS_INCD_BALE2_personne.DATE_FIN_VALD - DRIS_FAITS_INCD_BALE2_personne.DATE_DEBU_VALD
    END)  >  30
      )
    )  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P')
      OR   DRIS_FAITS_INCD_BALE2_personne.NUMR_PERS  IN  (SELECT
      DRIS_FAITS_INCD_BALE2_contrat.NUMR_PERS
    FROM
      DRIS_FAITS_INCD_BALE2  DRIS_FAITS_INCD_BALE2_contrat
    WHERE
    ( DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C'  )
      AND  ( DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C'  )
      AND  (
      DRIS_FAITS_INCD_BALE2_contrat.PERD_ARRT_INFO  =  @variable('Période d''Arrêté (AAAAMM) ?')  AND  (DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C')
      AND  DRIS_FAITS_INCD_BALE2_contrat.CODE_STTT_INCD  =  '1'  AND  (DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C')
      AND  DRIS_FAITS_INCD_BALE2_contrat.CODE_TYPE_INCD  =  '17'  AND  (DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C')
      )
    GROUP BY
      DRIS_FAITS_INCD_BALE2_contrat.NUMR_PERS
    HAVING
      ( 
      SUM(CASE 
         WHEN DRIS_FAITS_INCD_BALE2_contrat.CODE_STTT_INCD = '1' THEN LAST_DAY(TO_DATE(DRIS_FAITS_INCD_BALE2_contrat.PERD_ARRT_INFO, 'YYYYMM')) - DRIS_FAITS_INCD_BALE2_contrat.DATE_DEBU_VALD 
    ELSE DRIS_FAITS_INCD_BALE2_contrat.DATE_FIN_VALD - DRIS_FAITS_INCD_BALE2_contrat.DATE_DEBU_VALD
    END)  >  90
      )
    )  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P')
      OR   DRIS_FAITS_INCD_BALE2_personne.NUMR_PERS  IN  (SELECT
      DRIS_FAITS_INCD_BALE2_contrat.NUMR_PERS
    FROM
      DRIS_FAITS_INCD_BALE2  DRIS_FAITS_INCD_BALE2_contrat,
      DRIS_BALE2,
      RDWH_VT_HIER_CODE_DECI,
      DRIS_FAITS_ET_SURF_FINN
    WHERE
      ( DRIS_FAITS_INCD_BALE2_contrat.NUMR_ENTT_TITL=DRIS_FAITS_ET_SURF_FINN.NUMR_ENTT_TITL(+) and DRIS_FAITS_INCD_BALE2_contrat.NUMR_PERS=DRIS_FAITS_ET_SURF_FINN.NUMR_PERS(+) and DRIS_FAITS_INCD_BALE2_contrat.PERD_ARRT_INFO=DRIS_FAITS_ET_SURF_FINN.PERD_ARRT_INFO(+) and DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD= 'C'  )
      AND  ( ((DRIS_BALE2.CODE_TYPE_ORGN_PRDT='CARTB' and 
    DRIS_BALE2.PERD_ARRT_INFO=DRIS_FAITS_ET_SURF_FINN.PERD_ARRT_INFO and 
      DRIS_BALE2.NUMR_ENTT_TITL=DRIS_FAITS_ET_SURF_FINN.NUMR_ENTT_TITL ) or
       ( DRIS_BALE2.CODE_TYPE_ORGN_PRDT<>'CARTB' and DRIS_BALE2.PERD_ARRT_INFO=DRIS_FAITS_ET_SURF_FINN.PERD_ARRT_INFO and 
      DRIS_BALE2.NUMR_PERS=DRIS_FAITS_ET_SURF_FINN.NUMR_PERS and DRIS_BALE2.NUMR_ENTT_TITL=DRIS_FAITS_ET_SURF_FINN.NUMR_ENTT_TITL  ))
      )
      AND  ( RDWH_VT_HIER_CODE_DECI.CODE_DECI(+)=DRIS_BALE2.CODE_DECI  )
      AND  ( DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C'  )
      AND  ( DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C'  )
      AND  (
      DRIS_FAITS_INCD_BALE2_contrat.PERD_ARRT_INFO  =  @variable('Période d''Arrêté (AAAAMM) ?')  AND  (DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C')
      AND  DRIS_FAITS_INCD_BALE2_contrat.CODE_STTT_INCD  =  '1'  AND  (DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C')
      AND  DRIS_FAITS_INCD_BALE2_contrat.CODE_TYPE_INCD  =  '04'  AND  (DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C')
      AND  DRIS_BALE2.PERD_ARRT_INFO  =  @variable('Période d''Arrêté (AAAAMM) ?')
      AND  DRIS_BALE2.NUMR_PERS  =  DRIS_FAITS_INCD_BALE2_contrat.NUMR_PERS
      AND  DRIS_FAITS_INCD_BALE2_contrat.REFR_PRDT  =  DRIS_BALE2.REFR_PRDT  AND  (DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C')
      AND  DRIS_FAITS_INCD_BALE2_contrat.CODE_GUIC  =  DRIS_BALE2.CODE_GUIC  AND  (DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C')
      AND  RDWH_VT_HIER_CODE_DECI.LIBL_MACR_FAML  !=  'PRET IMO'
      )
    GROUP BY
      DRIS_FAITS_INCD_BALE2_contrat.NUMR_PERS
    HAVING
      ( 
      SUM(CASE 
         WHEN DRIS_FAITS_INCD_BALE2_contrat.CODE_STTT_INCD = '1' THEN LAST_DAY(TO_DATE(DRIS_FAITS_INCD_BALE2_contrat.PERD_ARRT_INFO, 'YYYYMM')) - DRIS_FAITS_INCD_BALE2_contrat.DATE_DEBU_VALD 
    ELSE DRIS_FAITS_INCD_BALE2_contrat.DATE_FIN_VALD - DRIS_FAITS_INCD_BALE2_contrat.DATE_DEBU_VALD
    END)  >  90
      )
    )  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P')
      OR   DRIS_FAITS_INCD_BALE2_personne.NUMR_PERS  IN  (SELECT
      DRIS_FAITS_INCD_BALE2_contrat.NUMR_PERS
    FROM
      DRIS_FAITS_INCD_BALE2  DRIS_FAITS_INCD_BALE2_contrat,
      DRIS_BALE2,
      RDWH_VT_HIER_CODE_DECI,
      DRIS_FAITS_ET_SURF_FINN
    WHERE
      ( DRIS_FAITS_INCD_BALE2_contrat.NUMR_ENTT_TITL=DRIS_FAITS_ET_SURF_FINN.NUMR_ENTT_TITL(+) and DRIS_FAITS_INCD_BALE2_contrat.NUMR_PERS=DRIS_FAITS_ET_SURF_FINN.NUMR_PERS(+) and DRIS_FAITS_INCD_BALE2_contrat.PERD_ARRT_INFO=DRIS_FAITS_ET_SURF_FINN.PERD_ARRT_INFO(+) and DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD= 'C'  )
      AND  ( ((DRIS_BALE2.CODE_TYPE_ORGN_PRDT='CARTB' and 
    DRIS_BALE2.PERD_ARRT_INFO=DRIS_FAITS_ET_SURF_FINN.PERD_ARRT_INFO and 
      DRIS_BALE2.NUMR_ENTT_TITL=DRIS_FAITS_ET_SURF_FINN.NUMR_ENTT_TITL ) or
       ( DRIS_BALE2.CODE_TYPE_ORGN_PRDT<>'CARTB' and DRIS_BALE2.PERD_ARRT_INFO=DRIS_FAITS_ET_SURF_FINN.PERD_ARRT_INFO and 
      DRIS_BALE2.NUMR_PERS=DRIS_FAITS_ET_SURF_FINN.NUMR_PERS and DRIS_BALE2.NUMR_ENTT_TITL=DRIS_FAITS_ET_SURF_FINN.NUMR_ENTT_TITL  ))
      )
      AND  ( RDWH_VT_HIER_CODE_DECI.CODE_DECI(+)=DRIS_BALE2.CODE_DECI  )
      AND  ( DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C'  )
      AND  ( DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C'  )
      AND  (
      DRIS_FAITS_INCD_BALE2_contrat.PERD_ARRT_INFO  =  @variable('Période d''Arrêté (AAAAMM) ?')  AND  (DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C')
      AND  DRIS_FAITS_INCD_BALE2_contrat.CODE_STTT_INCD  =  '1'  AND  (DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C')
      AND  DRIS_FAITS_INCD_BALE2_contrat.CODE_TYPE_INCD  =  '04'  AND  (DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C')
      AND  DRIS_BALE2.PERD_ARRT_INFO  =  @variable('Période d''Arrêté (AAAAMM) ?')
      AND  DRIS_BALE2.NUMR_PERS  =  DRIS_FAITS_INCD_BALE2_contrat.NUMR_PERS
      AND  DRIS_FAITS_INCD_BALE2_contrat.REFR_PRDT  =  DRIS_BALE2.REFR_PRDT  AND  (DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C')
      AND  DRIS_FAITS_INCD_BALE2_contrat.CODE_GUIC  =  DRIS_BALE2.CODE_GUIC  AND  (DRIS_FAITS_INCD_BALE2_contrat.CODE_NATR_INCD ='C')
      AND  RDWH_VT_HIER_CODE_DECI.LIBL_MACR_FAML  =  'PRET IMMO'
      )
    GROUP BY
      DRIS_FAITS_INCD_BALE2_contrat.NUMR_PERS
    HAVING
      ( 
      SUM(CASE 
         WHEN DRIS_FAITS_INCD_BALE2_contrat.CODE_STTT_INCD = '1' THEN LAST_DAY(TO_DATE(DRIS_FAITS_INCD_BALE2_contrat.PERD_ARRT_INFO, 'YYYYMM')) - DRIS_FAITS_INCD_BALE2_contrat.DATE_DEBU_VALD 
    ELSE DRIS_FAITS_INCD_BALE2_contrat.DATE_FIN_VALD - DRIS_FAITS_INCD_BALE2_contrat.DATE_DEBU_VALD
    END)  >  180
      )
    )  AND  (DRIS_FAITS_INCD_BALE2_personne.CODE_NATR_INCD ='P'))
      AND  RDWH_EDS_HIERARCHIE_GERE.DESG_COUR_EDS_NIV5  !=  'REC AM'
      AND  RDWH_EDS_HIERARCHIE_GERE.DESG_COUR_EDS_NIV7  =  'JURI & REC'
      )
    Pour comprendre la génération de cette requête, elle est faite sous Business objects. Il y a une couche sémantique supplémentaire appelé Univers entre l'affichage des données, et la bdd.

  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
    Jonathan Lewis a initié une série d'articles concernant l'interprétation des plans d'exécutions dont toute personne s'intéressant au sujet devrait lire.

  5. #5
    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
    Rassure moi, ce n'est pas un développeur qui a écrit cette requête ?
    Je déteste BO, ça te pond des requêtes monstrueuses avec des () à n'en plus finir pour rien..
    Bref 15 minutes pour reformater la requête et déjà il y a des choses qui me gênent

    1: Des OR sans ().. là je ne sais plus quelle est la règle SQL de priorité avec les AND
    2: Des redondances de conditions dris_faits_incd_bale2_personne.code_natr_incd='P' ou 'C' un peu partout (8 fois dans une sous requête !)
    3 : Des alias identiques entre table et sous table
    4 : Des alias plus longs que les noms de table
    Bref avant toute optimisation de code sql.. il faut simplifier le code.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    SELECT dris_faits_incd_bale2_personne.numr_pers, rdwh_eds_hierarchie_gere.desg_cour_eds
    FROM DRIS_FAITS_INCD_BALE2  dris_faits_incd_bale2_personne,
        RDWH_EDS_HIERARCHIE  rdwh_eds_hierarchie_gere,
        DCLI_PROFIL_ENT_TIT,
        DRIS_FAITS_ET_SURF_FINN
    WHERE dris_faits_et_surf_finn.numr_entt_titl=dcli_profil_ent_tit.numr_entt_titl(+)
    AND dcli_profil_ent_tit.eds_extr_gere_par=rdwh_eds_hierarchie_gere.idnt_extr_eds(+)
    AND dcli_profil_ent_tit.type_eds_gere_par=rdwh_eds_hierarchie_gere.type_elmt_strc(+)
    AND rdwh_eds_hierarchie_gere.type_orgn(+)='002'
    AND dris_faits_incd_bale2_personne.numr_pers=dris_faits_et_surf_finn.numr_pers(+) 
    AND dris_faits_incd_bale2_personne.perd_arrt_info=dris_faits_et_surf_finn.perd_arrt_info(+) 
    AND dris_faits_incd_bale2_personne.code_natr_incd='P'
    AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    AND  (
    			dris_faits_incd_bale2_personne.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')  
    	AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    	AND dris_faits_incd_bale2_personne.numr_pers  IN  (SELECT dris_faits_incd_bale2_personne.numr_pers
    										FROM DRIS_FAITS_INCD_BALE2  dris_faits_incd_bale2_personne
    										WHERE dris_faits_incd_bale2_personne.code_natr_incd ='P'
    										AND dris_faits_incd_bale2_personne.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')  
    										AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    										AND dris_faits_incd_bale2_personne.code_sttt_incd  =  '1'  
    										AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    										AND dris_faits_incd_bale2_personne.code_type_incd  IN  ('90', '9A', '9B', '9C', '9D', '9E', '9F') 
    										AND dris_faits_incd_bale2_personne.code_natr_incd ='P')
    	AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    	AND  (
    			dris_faits_incd_bale2_personne.numr_pers  IN  (SELECT dris_faits_incd_bale2_personne.numr_pers
    											FROM DRIS_FAITS_INCD_BALE2  dris_faits_incd_bale2_personne
    											WHERE dris_faits_incd_bale2_personne.code_natr_incd ='P' 
    											AND dris_faits_incd_bale2_personne.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')  
    											AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    											AND dris_faits_incd_bale2_personne.code_sttt_incd  =  '1'
    											AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    											AND dris_faits_incd_bale2_personne.code_type_incd  IN  ('29', '30', '32', '38', '48', '49', '68', '69', '85', '86', '87')
    											AND dris_faits_incd_bale2_personne.code_natr_incd ='P')
    			AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    			OR dris_faits_incd_bale2_personne.numr_pers  IN  (SELECT dris_faits_incd_bale2_contrat.numr_pers
    											FROM DRIS_FAITS_INCD_BALE2  dris_faits_incd_bale2_contrat
    											WHERE dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_faits_incd_bale2_contrat.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_faits_incd_bale2_contrat.code_sttt_incd  =  '1'
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_faits_incd_bale2_contrat.code_type_incd  IN  ('65', '79', '84', '88')
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C')
    			AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    			OR dris_faits_incd_bale2_personne.numr_pers  IN  (SELECT dris_faits_incd_bale2_personne.numr_pers
    											FROM DRIS_FAITS_INCD_BALE2  dris_faits_incd_bale2_personne,
    												DRIS_BALE2,
    												DRIS_TT_SEGM_SUIV_RISQ  dris_tt_segm_suiv_risq_pers,
    												DRIS_FAITS_ET_SURF_FINN
    											WHERE dris_bale2.code_segm_risq_pers=dris_tt_segm_suiv_risq_pers.code_niv5(+)
    											AND dris_faits_incd_bale2_personne.numr_pers=dris_faits_et_surf_finn.numr_pers(+)
    											AND dris_faits_incd_bale2_personne.perd_arrt_info=dris_faits_et_surf_finn.perd_arrt_info(+)
    											AND dris_faits_incd_bale2_personne.code_natr_incd='P'
    											AND (
    												 (dris_bale2.code_type_orgn_prdt='CARTB' AND dris_bale2.perd_arrt_info=dris_faits_et_surf_finn.perd_arrt_info AND dris_bale2.numr_entt_titl=dris_faits_et_surf_finn.numr_entt_titl )
    												OR (dris_bale2.code_type_orgn_prdt<>'CARTB' AND dris_bale2.perd_arrt_info=dris_faits_et_surf_finn.perd_arrt_info AND dris_bale2.numr_pers=dris_faits_et_surf_finn.numr_pers AND dris_bale2.numr_entt_titl=dris_faits_et_surf_finn.numr_entt_titl)
    												)
    											AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    											AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    											AND dris_faits_incd_bale2_personne.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')
    											AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    											AND dris_faits_incd_bale2_personne.code_type_incd = '46'
    											AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    											AND dris_faits_incd_bale2_personne.code_sttt_incd = '1'
    											AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    											AND dris_bale2.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')
    											AND dris_bale2.numr_pers  =  dris_faits_incd_bale2_personne.numr_pers
    											AND dris_tt_segm_suiv_risq_pers.libl_niv2  !=  'PART'
    											GROUP BY dris_faits_incd_bale2_personne.numr_pers
    											HAVING SUM(CASE WHEN dris_faits_incd_bale2_personne.code_sttt_incd = '1' THEN LAST_DAY(TO_DATE(dris_faits_incd_bale2_personne.perd_arrt_info, 'YYYYMM')) - dris_faits_incd_bale2_personne.date_debu_vald 
    											ELSE dris_faits_incd_bale2_personne.date_fin_vald - dris_faits_incd_bale2_personne.date_debu_vald END)  >  30
    											)
    			AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    			OR dris_faits_incd_bale2_personne.numr_pers  IN  (SELECT dris_faits_incd_bale2_contrat.numr_pers
    											FROM DRIS_FAITS_INCD_BALE2  dris_faits_incd_bale2_contrat
    											WHERE dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND  dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_faits_incd_bale2_contrat.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_faits_incd_bale2_contrat.code_sttt_incd  =  '1'
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_faits_incd_bale2_contrat.code_type_incd  =  '17'
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											GROUP BY dris_faits_incd_bale2_contrat.numr_pers
    											HAVING SUM(CASE WHEN dris_faits_incd_bale2_contrat.code_sttt_incd = '1' THEN LAST_DAY(TO_DATE(dris_faits_incd_bale2_contrat.perd_arrt_info, 'YYYYMM')) - dris_faits_incd_bale2_contrat.date_debu_vald 
    											ELSE dris_faits_incd_bale2_contrat.date_fin_vald - dris_faits_incd_bale2_contrat.date_debu_vald END)  >  90 )
    			AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    			OR dris_faits_incd_bale2_personne.numr_pers  IN  (SELECT dris_faits_incd_bale2_contrat.numr_pers
    											FROM DRIS_FAITS_INCD_BALE2  dris_faits_incd_bale2_contrat,
    												DRIS_BALE2,
    												RDWH_VT_HIER_CODE_DECI,
    												DRIS_FAITS_ET_SURF_FINN
    											WHERE dris_faits_incd_bale2_contrat.numr_entt_titl=dris_faits_et_surf_finn.numr_entt_titl(+) 
    											AND dris_faits_incd_bale2_contrat.numr_pers=dris_faits_et_surf_finn.numr_pers(+) 
    											AND dris_faits_incd_bale2_contrat.perd_arrt_info=dris_faits_et_surf_finn.perd_arrt_info(+) 
    											AND dris_faits_incd_bale2_contrat.code_natr_incd= 'C' 
    											AND (
    												(dris_bale2.code_type_orgn_prdt='CARTB' AND dris_bale2.perd_arrt_info=dris_faits_et_surf_finn.perd_arrt_info AND dris_bale2.numr_entt_titl=dris_faits_et_surf_finn.numr_entt_titl )
    												OR (dris_bale2.code_type_orgn_prdt<>'CARTB' AND dris_bale2.perd_arrt_info=dris_faits_et_surf_finn.perd_arrt_info AND dris_bale2.numr_pers=dris_faits_et_surf_finn.numr_pers AND dris_bale2.numr_entt_titl=dris_faits_et_surf_finn.numr_entt_titl)
    												)
    											AND rdwh_vt_hier_code_deci.code_deci(+)=dris_bale2.code_deci
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_faits_incd_bale2_contrat.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_faits_incd_bale2_contrat.code_sttt_incd =  '1'
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_faits_incd_bale2_contrat.code_type_incd  =  '04'
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_bale2.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')
    											AND dris_bale2.numr_pers  =  dris_faits_incd_bale2_contrat.numr_pers
    											AND dris_faits_incd_bale2_contrat.refr_prdt  =  dris_bale2.refr_prdt
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_faits_incd_bale2_contrat.code_guic  =  dris_bale2.code_guic
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND  rdwh_vt_hier_code_deci.libl_macr_faml  !=  'PRET IMO'
    											GROUP BY dris_faits_incd_bale2_contrat.numr_pers
    											HAVING SUM(CASE WHEN dris_faits_incd_bale2_contrat.code_sttt_incd = '1' THEN LAST_DAY(TO_DATE(dris_faits_incd_bale2_contrat.perd_arrt_info, 'YYYYMM')) - dris_faits_incd_bale2_contrat.date_debu_vald 
    											ELSE dris_faits_incd_bale2_contrat.date_fin_vald - dris_faits_incd_bale2_contrat.date_debu_vald END)  >  90
    											)
    			AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    			OR dris_faits_incd_bale2_personne.numr_pers  IN  (SELECT dris_faits_incd_bale2_contrat.numr_pers
    											FROM DRIS_FAITS_INCD_BALE2  dris_faits_incd_bale2_contrat,
    												DRIS_BALE2,
    												RDWH_VT_HIER_CODE_DECI,
    												DRIS_FAITS_ET_SURF_FINN
    											WHERE ( dris_faits_incd_bale2_contrat.numr_entt_titl=dris_faits_et_surf_finn.numr_entt_titl(+) AND dris_faits_incd_bale2_contrat.numr_pers=dris_faits_et_surf_finn.numr_pers(+) AND dris_faits_incd_bale2_contrat.perd_arrt_info=dris_faits_et_surf_finn.perd_arrt_info(+) AND dris_faits_incd_bale2_contrat.code_natr_incd= 'C'  )
    											AND (
    												(dris_bale2.code_type_orgn_prdt='CARTB' AND dris_bale2.perd_arrt_info=dris_faits_et_surf_finn.perd_arrt_info AND dris_bale2.numr_entt_titl=dris_faits_et_surf_finn.numr_entt_titl )
    												OR (dris_bale2.code_type_orgn_prdt<>'CARTB' AND dris_bale2.perd_arrt_info=dris_faits_et_surf_finn.perd_arrt_info AND dris_bale2.numr_pers=dris_faits_et_surf_finn.numr_pers AND dris_bale2.numr_entt_titl=dris_faits_et_surf_finn.numr_entt_titl)
    												)
    											AND rdwh_vt_hier_code_deci.code_deci(+)=dris_bale2.code_deci
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C' 
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_faits_incd_bale2_contrat.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_faits_incd_bale2_contrat.code_sttt_incd  =  '1'
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_faits_incd_bale2_contrat.code_type_incd  =  '04'  AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_bale2.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')
    											AND dris_bale2.numr_pers  =  dris_faits_incd_bale2_contrat.numr_pers
    											AND dris_faits_incd_bale2_contrat.refr_prdt  =  dris_bale2.refr_prdt
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND dris_faits_incd_bale2_contrat.code_guic  =  dris_bale2.code_guic
    											AND dris_faits_incd_bale2_contrat.code_natr_incd ='C'
    											AND rdwh_vt_hier_code_deci.libl_macr_faml  =  'PRET IMMO'
    											GROUP BY dris_faits_incd_bale2_contrat.numr_pers
    											HAVING SUM(CASE WHEN dris_faits_incd_bale2_contrat.code_sttt_incd = '1' THEN LAST_DAY(TO_DATE(dris_faits_incd_bale2_contrat.perd_arrt_info, 'YYYYMM')) - dris_faits_incd_bale2_contrat.date_debu_vald 
    											ELSE dris_faits_incd_bale2_contrat.date_fin_vald - dris_faits_incd_bale2_contrat.date_debu_vald END)  >  180
    											)
    			AND dris_faits_incd_bale2_personne.code_natr_incd ='P'
    		)
    	AND rdwh_eds_hierarchie_gere.desg_cour_eds_niv5  !=  'REC AM'
    	AND rdwh_eds_hierarchie_gere.desg_cour_eds_niv7  =  'JURI & REC'
    )
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    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
    Essaye cette requête (faut vérifier qu'elle fasse la même chose), j'ai simplifié rapidement j'ai pu faire des erreurs.

    J'ai juste mis des alias corrects, supprimé les doublons de condition, viré les CASE inutiles et remplacé les IN par des EXISTS (à voir si c'est mieux)

    purée, j'avais encore oublié un doublon sur code_natr_incd = 'C'

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    SELECT personne.numr_pers, hierarchie.desg_cour_eds
    FROM DRIS_FAITS_INCD_BALE2  personne,
        RDWH_EDS_HIERARCHIE  hierarchie,
        DCLI_PROFIL_ENT_TIT tit,
        DRIS_FAITS_ET_SURF_FINN surf
    WHERE surf.numr_entt_titl = tit.numr_entt_titl(+)
    AND tit.eds_extr_gere_par = hierarchie.idnt_extr_eds(+)
    AND tit.type_eds_gere_par = hierarchie.type_elmt_strc(+)
    AND hierarchie.type_orgn(+)='002'
    AND personne.numr_pers = surf.numr_pers(+) 
    AND personne.perd_arrt_info = surf.perd_arrt_info(+) 
    AND personne.code_natr_incd = 'P'
    AND personne.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')  
    AND personne.numr_pers  IN  (SELECT b2.numr_pers
    					FROM DRIS_FAITS_INCD_BALE2  b2
    					WHERE b2.code_natr_incd ='P'
    					AND b2.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')  
    					AND b2.code_type_incd  IN  ('90', '9A', '9B', '9C', '9D', '9E', '9F') 
    					AND b2.code_sttt_incd  =  '1')  
    AND  (
    			EXISTS (SELECT 1
    					FROM DRIS_FAITS_INCD_BALE2  p2
    					WHERE p2.code_natr_incd ='P' 
    					AND p2.perd_arrt_info =  @variable('Période d''Arrêté (AAAAMM) ?')  
    					AND p2.code_type_incd IN ('29', '30', '32', '38', '48', '49', '68', '69', '85', '86', '87')
    					AND p2.code_sttt_incd =  '1'
    					AND p2.numr_pers = personne.numr_pers)
    		OR EXISTS (SELECT 1
    				FROM DRIS_FAITS_INCD_BALE2  contrat
    				WHERE contrat.code_natr_incd ='C'
    				AND contrat.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')
    				AND contrat.code_type_incd  IN  ('65', '79', '84', '88')
    				AND contrat.code_sttt_incd  =  '1'
    				AND contrat.numr_pers = personne.numr_pers)
    		OR EXISTS (SELECT 1
    				FROM DRIS_FAITS_INCD_BALE2  p2,
    					DRIS_BALE2 b2,
    					DRIS_TT_SEGM_SUIV_RISQ  risq,
    					DRIS_FAITS_ET_SURF_FINN surf2
    				WHERE b2.code_segm_risq_pers=risq.code_niv5(+)
    				AND p2.numr_pers=surf2.numr_pers(+)
    				AND p2.perd_arrt_info=surf2.perd_arrt_info(+)
    				AND p2.code_natr_incd='P'
    				AND (
    					(b2.code_type_orgn_prdt='CARTB' AND b2.perd_arrt_info=surf2.perd_arrt_info AND b2.numr_entt_titl=surf2.numr_entt_titl )
    					OR (b2.code_type_orgn_prdt<>'CARTB' AND b2.perd_arrt_info=surf2.perd_arrt_info AND b2.numr_pers=surf2.numr_pers AND b2.numr_entt_titl=surf2.numr_entt_titl)
    					)
    				AND p2.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')
    				AND p2.code_type_incd = '46'
    				AND p2.code_sttt_incd = '1'
    				AND b2.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')
    				AND b2.numr_pers  =  p2.numr_pers
    				AND risq.libl_niv2  !=  'PART'
    				AND p2.numr_pers = personne.numr_pers
    				GROUP BY p2.numr_pers
    				HAVING SUM(LAST_DAY(TO_DATE(p2.perd_arrt_info, 'YYYYMM')) - p2.date_debu_vald )  >  30
    				)
    		OR EXISTS  (SELECT 1
    				FROM DRIS_FAITS_INCD_BALE2  contrat
    				WHERE contrat.code_natr_incd ='C'
    				AND contrat.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')
    				AND contrat.code_sttt_incd  =  '1'
    				AND contrat.code_type_incd  =  '17'
    				AND contrat.numr_pers = personne.numr_pers
    				GROUP BY contrat.numr_pers
    				HAVING SUM(LAST_DAY(TO_DATE(contrat.perd_arrt_info, 'YYYYMM')) - contrat.date_debu_vald )  >  90 )
    		OR EXISTS (SELECT 1
    				FROM DRIS_FAITS_INCD_BALE2  contrat,
    					DRIS_BALE2 b2,
    					RDWH_VT_HIER_CODE_DECI deci,
    					DRIS_FAITS_ET_SURF_FINN surf2
    				WHERE contrat.numr_entt_titl = surf2.numr_entt_titl(+) 
    				AND contrat.numr_pers = surf2.numr_pers(+) 
    				AND contrat.perd_arrt_info = surf2.perd_arrt_info(+) 
    				AND (
    					(b2.code_type_orgn_prdt='CARTB' AND b2.perd_arrt_info=surf2.perd_arrt_info AND b2.numr_entt_titl=surf2.numr_entt_titl )
    					OR (b2.code_type_orgn_prdt<>'CARTB' AND b2.perd_arrt_info=surf2.perd_arrt_info AND b2.numr_pers=surf2.numr_pers AND b2.numr_entt_titl=surf2.numr_entt_titl)
    					)
    				AND deci.code_deci (+)= b2.code_deci
    				AND deci.libl_macr_faml != 'PRET IMO'
    				AND contrat.code_natr_incd = 'C' 
    				AND contrat.perd_arrt_info = @variable('Période d''Arrêté (AAAAMM) ?')
    				AND contrat.code_sttt_incd = '1'
    				AND contrat.code_type_incd = '04'
    				AND b2.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')
    				AND b2.numr_pers  =  contrat.numr_pers
    				AND contrat.refr_prdt = b2.refr_prdt
    				AND contrat.code_guic = b2.code_guic
    				AND contrat.numr_pers  = personne.numr_pers
    				GROUP BY contrat.numr_pers
    				HAVING SUM(LAST_DAY(TO_DATE(contrat.perd_arrt_info, 'YYYYMM')) - contrat.date_debu_vald)  >  90
    				)
    		OR EXISTS (SELECT 1
    				FROM DRIS_FAITS_INCD_BALE2  contrat,
    					DRIS_BALE2 b2,
    					RDWH_VT_HIER_CODE_DECI deci,
    					DRIS_FAITS_ET_SURF_FINN surf2
    				WHERE contrat.numr_entt_titl=surf2.numr_entt_titl(+) 
    				AND contrat.numr_pers=surf2.numr_pers(+)
    				AND contrat.perd_arrt_info=surf2.perd_arrt_info(+) 
    				AND (
    					(b2.code_type_orgn_prdt='CARTB' AND b2.perd_arrt_info=surf2.perd_arrt_info AND b2.numr_entt_titl=surf2.numr_entt_titl )
    					OR (b2.code_type_orgn_prdt<>'CARTB' AND b2.perd_arrt_info=surf2.perd_arrt_info AND b2.numr_pers=surf2.numr_pers AND b2.numr_entt_titl=surf2.numr_entt_titl)
    					)
    				AND deci.code_deci(+) = b2.code_deci
    				AND deci.libl_macr_faml  =  'PRET IMMO'
    				AND contrat.code_natr_incd ='C' 
    				AND contrat.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')
    				AND contrat.code_sttt_incd  =  '1'
    				AND contrat.code_type_incd  =  '04'
    				AND b2.perd_arrt_info  =  @variable('Période d''Arrêté (AAAAMM) ?')
    				AND b2.numr_pers  =  contrat.numr_pers
    				AND contrat.refr_prdt  =  b2.refr_prdt
    				AND contrat.code_guic  =  b2.code_guic
    				AND contrat.numr_pers = personne.numr_pers
    				GROUP BY contrat.numr_pers
    				HAVING SUM(LAST_DAY(TO_DATE(contrat.perd_arrt_info, 'YYYYMM')) - contrat.date_debu_vald)  >  180
    				)
    	)
    AND hierarchie.desg_cour_eds_niv5  !=  'REC AM'
    AND hierarchie.desg_cour_eds_niv7  =  'JURI & REC'
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 32
    Points : 20
    Points
    20
    Par défaut
    Après tout le travail et les informations fourni par @McM … 0 réponse ?
    Pas un merci, pas de commentaire sur l'intérêt d'une requête claire et lisible ?

  8. #8
    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
    Oh, tu sais "réouvrir" un post de 2014 .. c'est pas bien important, il y a longtemps que je n'attends plus de réponse
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    McM, quand je lis ça "Un table access full indique généralement un manque d'index, ou des stats pas à jour." je dirais plutôt que, peut-être, que le CBO est au top et qu'il a tout compris de la requête, qu'il a de bonnes stats, tous les index sont là mais il a décidé de ne pas les utiliser à bon escient.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/03/2009, 19h04
  2. DBlink et plan d'exécution sous 9i
    Par chmanu dans le forum SQL
    Réponses: 3
    Dernier message: 14/11/2008, 15h08
  3. Exécutable sous JBuilder
    Par biglong dans le forum JBuilder
    Réponses: 4
    Dernier message: 29/05/2005, 15h39
  4. [debutant]Plan de maintenance sous sql serveur 2000
    Par christophebmx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/05/2005, 12h18
  5. Erreurs d'exécution sous delphi 5
    Par nkd dans le forum Langage
    Réponses: 3
    Dernier message: 06/11/2004, 17h25

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