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

Administration Oracle Discussion :

Interprétation du rapport Statspack


Sujet :

Administration Oracle

  1. #81
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Points : 341
    Points
    341
    Par défaut
    petit souci:
    - j'ai supprimé les fichiers traces présents dans udump
    - j'ai activé les traces pour mon process serveur avec la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    oradebug setospid 1473
    oradebug event 10046 trace name context forever, level 12
    - j'ai passé le paramètre max_dump_file_size à unlimited

    mais je n'ai rien dans udump pourtant mon traitement est en train de s'executer

  2. #82
    Membre régulier
    Inscrit en
    Septembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 73
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par pifor Voir le message
    Mais cela ne donne pas le temps d'exécution du code PL/SQL qui n'est dans pas un package ni du programme Java (que je mets au premier dans la liste des "suspects"). Et vous pouver donnez les temps d'exécutions des différents packages ? C'est une des premières choses à analyser.
    Ahaha excellent pour le JAVA pas mieux... Mais chuuuttt... (On va s'attirer les foudres...)

  3. #83
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par farenheiit Voir le message
    je comprends pas...dans v$sql on ne trouve que les reqêtes actuellement dans la library cache ou bien toutes les requêtes depuis le démarrage de la base?
    Qui a raison? Pifor ou Orafrance?
    Evidemment dans la limite de l'espace dispo en cache

  4. #84
    Membre régulier
    Inscrit en
    Septembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 73
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par farenheiit Voir le message
    petit souci:
    - j'ai supprimé les fichiers traces présents dans udump
    - j'ai activé les traces pour mon process serveur avec la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    oradebug setospid 1473
    oradebug event 10046 trace name context forever, level 12
    - j'ai passé le paramètre max_dump_file_size à unlimited

    mais je n'ai rien dans udump pourtant mon traitement est en train de s'executer
    Peux tu nous refaire le "ps" deuxième version ? merci.

    Je pense que la partie java possède sa propre connexion à la base donc tu devras aussi tracer celle ci dans un sqlplus...

  5. #85
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Sinon, elle en est où la trace ?

  6. #86
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Points : 341
    Points
    341
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps -efo time,stime,pid,vsz,args | grep prism | sort -r +0 | head -20
    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
     
     04:14:29   Feb_18 15124 964160 oracleprism (LOCAL=NO)
       01:40:00 12:05:39  1473 967856 oracleprism (LOCAL=NO)
          43:35   Feb_18  1884 974848 ora_lgwr_prism
          34:23   Feb_18  1882 977192 ora_dbw0_prism
          20:16   Feb_18  8021 963688 oracleprism (LOCAL=NO)
          16:25 23:37:01 21616 967520 oracleprism (LOCAL=NO)
          14:18 18:04:22 19293 966256 oracleprism (LOCAL=NO)
          14:08   Feb_18  1894 970728 ora_arc0_prism
          05:57   Feb_18 28184 966520 oracleprism (LOCAL=NO)
          04:34   Feb_18 29088 966184 oracleprism (LOCAL=NO)
          04:09   Feb_18 29090 966944 oracleprism (LOCAL=NO)
          03:41 18:18:29 20672 963616 oracleprism (LOCAL=NO)
          03:40   Feb_18  1886 970784 ora_ckpt_prism
          02:55   Jan_21  7014 345800 ora_pmon_prism
          02:54   Jan_21  7016 345728 ora_dbw0_prism
          02:35   Jan_21  7018 345216 ora_lgwr_prism
          02:34   Jan_21  7020 345240 ora_ckpt_prism
          02:30 14:20:58 27393 965648 oracleprism (LOCAL=NO)
          02:30   Jan_21  7026 345344 ora_arc0_prism
          02:27   Feb_18  1880 964688 ora_pmon_prism

  7. #87
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Points : 341
    Points
    341
    Par défaut
    Et vous pouver donnez les temps d'exécutions des différents packages ? C'est une des premières choses à analyser.
    voici les temps d'executions:
    Analyze schéma => 45 min
    PCK_LOADER_UTL.PGlobal_import => 16h57-11h25
    PCK_LOADER_UTL.PGlobal_import_fin_chgt => 11h25-16h31
    pck_loader_pool.pCHARGE_POOL_PME => 16h31-17h37
    code java => 17h37-18h54

    on se rend compte que la proc qui coûte le plus est PCK_LOADER_UTL.PGlobal_import

    voici son contenu:
    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
     
    PROCEDURE PGlobal_import(Indate IN DATE DEFAULT NULL)
    is
    id  UTL_FILE.FILE_TYPE ;
     
     v_sessionid	NUMBER;
     
     v_termninal	VARCHAR2(50);
     
     v_entryid	VARCHAR2(50);
     
     v_user		VARCHAR2(50);
     
     v_uid		NUMBER;
     
    BEGIN
     
      BEGIN
     
    	SELECT USERENV('SESSIONID'),USERENV('TERMINAL'),USERENV('ENTRYID'), USER,UID
     
    	INTO v_sessionid,v_termninal,v_entryid,v_user,v_uid
     
    	FROM dual;
     
      EXCEPTION
     
       WHEN OTHERS THEN
     
       	NULL;
     
      END;
     
    DBMS_OUTPUT.put_line('DATE : '||TO_CHAR(SYSDATE,'DD/MM/YYYY HH24:MM'));
     
    DBMS_OUTPUT.put_line('USER : '||v_user);
     
    DBMS_OUTPUT.put_line('UID : '||TO_CHAR(v_uid));
     
    DBMS_OUTPUT.put_line('SESSIONID : '||v_sessionid);
     
    DBMS_OUTPUT.put_line('TERMINAL : '||v_termninal);
     
    DBMS_OUTPUT.put_line('ENTRYID : '||v_entryid);
     
    --  Vidage dans ttransaction
     
    EXECUTE IMMEDIATE ' truncate table TIND_TRANSACTION';
     
    -- UTILISATION DU ROLLBACK SEGMENT LARGE_RS
     
    ----DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    Pck_Loader_Utl.date_import(Indate);
     
     
    COMMIT;
     
    -- Chargement des classes secteurs
     
    Pck_Loader_Utl.transfert_data('TCLS_SECTEUR_LDR','TCLS_SECTEUR');
     
    COMMIT;
     
    -- chargement des tables de référence
     
    pck_loader_ref.pGlobalREF;
    COMMIT;
     
    --DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    -- chargement des notes des clients
     
    --Pck_Loader_Ref.notation;
     
    -- 20060703 AAAN V3.4 Appel du nouveau package d'intégration des notations
     
    Pck_Loader_INTA.PGlobalINTA;
     
    COMMIT;
     
    -- UTILISATION DU ROLLBACK SEGMENT LARGE_RS
     
    --DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    PCK_LOADER_CNC_CME.PDelete_CME_CONC;
     
    COMMIT;
     
    -- UTILISATION DU ROLLBACK SEGMENT LARGE_RS
     
    --DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    --PCK_LOADER_CNC_CME.pOPM_CME;
     
    --PCK_LOADER_CNC_CME.PRCM_MC2;
     
    PCK_LOADER_CNC_CME.pcharge_opemar;
     
    COMMIT;
     
    PCK_LOADER_BCE.PGLOBALBCE;
     
    -- chargement des activités
     
    --DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    pck_loader_ref.PLOAD_ACTIVITE;
     
    commit;
     
    --chargement des pools retails
     
    --DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    PCK_LOADER_POOL.PCHARGE_POOL_RETAIL;
     
    COMMIT;
     
    --chargement des pools PME
     
    /*--DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    PCK_LOADER_POOL.PCHARGE_POOL_PME;
     
    COMMIT;*/
     
    --chargement concours mc2
     
    --DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    PCK_LOADER_CNC_MC2.pDeleteCncMC2;
     
    COMMIT;
     
    --chargement concours mc2
     
    --DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    PCK_LOADER_CNC_MC2.PINSERTMC2;
     
    COMMIT;
     
    -- chargement des Collateraux NY
     
    -- PCK_IMPORT_NY.pLoadCollateralNY;
     
    COMMIT;
     
    --chargement des CDO
     
    --DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
     pck_loader_cdo.PGLOBALCDO;
     
    COMMIT;
     
    --DBMS_OUTPUT.put_line('fin chargement bce, chargement des Dc a venir');
    -- Chargement des CDS
     
    Pck_Loader_CDS.PGlobalCDS;
     
    commit;
     
    END PGlobal_import;
    dans cette proc les packages les plus couteux sont:
    PCK_LOADER_BCE.pConcours => + de 3h
    PCK_LOADER_BCE.pOperation => + de 1h
    PCK_LOADER_BCE.pTabAmo => - de 5h
    PCK_LOADER_BCE.pTabRembOpe => - de 5h
    PCK_LOADER_BCE.pGarantie => 1h

    donc les 2 procs PCK_LOADER_BCE.pTabAmo et PCK_LOADER_BCE.pTabRembOpe sont les plus couteuses et sont donc celles à optimiser en 1er

  8. #88
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par farenheiit Voir le message
    donc les 2 procs PCK_LOADER_BCE.pTabAmo et PCK_LOADER_BCE.pTabRembOpe sont les plus couteuses et sont donc celles à optimiser en 1er
    Tu peux nous les soumettre STP ?

  9. #89
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Points : 341
    Points
    341
    Par défaut
    avec plaisir:

    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
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
     
    PROCEDURE pTabAmo
     
    IS
     
    -- Tableaux des concours existant dans PRISM
     
    CURSOR CUR_TAB_AMO IS
     
    	   SELECT  /*+ rule */cnc.CNC_ID cnc_id,
     
    	          cnc.CNC_ID_BCE_GENERE id_genere,
     
    			  BCE_DEV_ECHEANCE_LDR,
     
      			  BCE_MNT_ECHEANCE_LDR,
     
      			  BCE_SIGNE_MNT_LDR,
     
      			  BCE_DT_ECHEANCE_LDR
     
    	   FROM   TTAB_AMO_BCE_CV2_LDR ldr,
     
    	          TCONCOURS cnc
     
    	   WHERE  ldr.BCE_ID_GEN_CNC_LDR = cnc.CNC_ID_BCE_GENERE
     
    	   ORDER BY cnc_id,BCE_DT_ECHEANCE_LDR  ;
     
      CUR_TAB_AMO_REC 	CUR_TAB_AMO%ROWTYPE;
     
      v_continuer       BOOLEAN;
     
      v_dt_test         DATE;
     
      v_nb_lg_ech       INTEGER := 0;
     
      v_cnc_id_preced   TCONCOURS.CNC_ID%TYPE := NULL;
     
      v_nb_TAmoDtEchFrmIncorr    INTEGER := 0;
     
      v_nb_TAmoDevNRensNExist    INTEGER := 0;
     
      v_nb_TAmoSigneNRensNExist  INTEGER := 0;
     
      v_nb_TAmoDtMntNRensNExist  INTEGER := 0;
     
     
    BEGIN
     
      v_nb_import := 0;
     
      v_nb_reject := 0;
     
      v_nb_insert := 0;
     
      v_nb_initial := 0;
     
      -- ouverture du fichier de log si nécessaire
     
      Pck_Log.POPEN(NULL);
     
      IF Pck_Log.FIsOpen(NULL) = 0 THEN
     
             Pck_Log.PERROROPEN(v_package_name||'.pTabAmo');
     
      END IF;
     
      Pck_Log.PWrite_Sep;
     
      Pck_Log.PWrite_Info(v_package_name||'.pTabAmo');
     
      -- Traitement des tableaux des concours BCE existant dans PRISM
     
      OPEN CUR_TAB_AMO;
     
      LOOP
     
          FETCH CUR_TAB_AMO INTO CUR_TAB_AMO_REC;
     
          EXIT WHEN CUR_TAB_AMO%NOTFOUND;
     
    	  BEGIN
     
    		 v_nb_import := v_nb_import + 1;
     
    		 -- Test sur le format de la date d'echeance
     
    		 v_continuer := TRUE;
     
    		 BEGIN
     
    		     SELECT TO_DATE(CUR_TAB_AMO_REC.BCE_DT_ECHEANCE_LDR,cstFormatDate)
     
    			 into v_dt_test
     
    		     FROM DUAL;
     
    		 EXCEPTION
     
    	    	 WHEN OTHERS THEN
     
    	  	     PCK_ANOMALIE.pInsertAnomalieTabAmo( PCK_ANOMALIE.rejTAmoDtEchFrmIncorr, CUR_TAB_AMO_REC.id_genere, CUR_TAB_AMO_REC.BCE_DT_ECHEANCE_LDR );
     
    			 v_nb_TAmoDtEchFrmIncorr := v_nb_TAmoDtEchFrmIncorr + 1;
     
    			 v_continuer := FALSE;
     
    		 END;
     
    		 IF ( v_continuer )
     
    		 THEN
     
    		     -- Si la devise n'est pas renseignee ou n'existe pas dans le referentiel PRISM
     
    		 	 IF ( CUR_TAB_AMO_REC.BCE_DEV_ECHEANCE_LDR IS NULL OR Fct_Exist('TDEVISE','DEV_CODE', CUR_TAB_AMO_REC.BCE_DEV_ECHEANCE_LDR) = 0 )
     
    			 THEN
     
    	  	     	 PCK_ANOMALIE.pInsertAnomalieTabAmo( PCK_ANOMALIE.rejTAmoDevNRensNExist, CUR_TAB_AMO_REC.id_genere, CUR_TAB_AMO_REC.BCE_DEV_ECHEANCE_LDR );
     
    			 	 v_nb_TAmoDevNRensNExist := v_nb_TAmoDevNRensNExist + 1;
     
    			 -- Si le signe du montant est different de '1' ou '2' ou n'est pas renseign‹
     
    			 ELSIF ( CUR_TAB_AMO_REC.BCE_SIGNE_MNT_LDR IS NULL
     
    				     OR
     
    				    (CUR_TAB_AMO_REC.BCE_SIGNE_MNT_LDR IS NOT NULL AND CUR_TAB_AMO_REC.BCE_SIGNE_MNT_LDR NOT IN (cstSigneMntAmoDiminAutor,cstSigneMntAmoAugmnAutor))
     
    			       )
     
    			 THEN
     
    	  	     	  PCK_ANOMALIE.pInsertAnomalieTabAmo( PCK_ANOMALIE.rejTAmoSigneNRensNExist, CUR_TAB_AMO_REC.id_genere, CUR_TAB_AMO_REC.BCE_SIGNE_MNT_LDR );
     
    			 	  v_nb_TAmoSigneNRensNExist := v_nb_TAmoSigneNRensNExist + 1;
     
    			 -- Si la date d'echeance ou le montant n'est pas renseigne
     
    			 ELSIF ( CUR_TAB_AMO_REC.BCE_DT_ECHEANCE_LDR IS NULL OR CUR_TAB_AMO_REC.BCE_MNT_ECHEANCE_LDR IS NULL )
     
    			 THEN
     
    	  	     	  PCK_ANOMALIE.pInsertAnomalieTabAmo( PCK_ANOMALIE.rejTAmoDtMntNRens, CUR_TAB_AMO_REC.id_genere );
     
    			 	  v_nb_TAmoDtMntNRensNExist := v_nb_TAmoDtMntNRensNExist + 1;
     
    			 ELSE
     
    	     	 	 -- Calcul du num‹ro de la ligne de tableau
     
    	     		 -- Si c'est le premier concours
     
    	     		 IF ( v_cnc_id_preced IS NULL )
     
    		 		 THEN
     
    		 	 	 	 v_cnc_id_preced := CUR_TAB_AMO_REC.cnc_id;
     
    		 	 		 v_nb_lg_ech := v_nb_lg_ech + 1;
     
    	             -- Si c'est le concours suivant
     
    	     		 ELSIF ( v_cnc_id_preced IS NOT NULL AND v_cnc_id_preced != CUR_TAB_AMO_REC.cnc_id)
     
    		 		 THEN
     
    		 	 	 	 v_nb_lg_ech := 1;
     
    			 		 v_cnc_id_preced := CUR_TAB_AMO_REC.cnc_id;
     
    	             ELSE -- C'est toujurs le mˆme concours
     
    		 	         v_nb_lg_ech := v_nb_lg_ech + 1;
     
    		 		 END IF;
     
    						-- Insertion
     
    						INSERT INTO TTAB_AMO (
     
    				 			   CNC_ID,
     
      							   LTA_LIGNE,
     
      							   DEV_CODE,
     
      							   LTA_ECHEANCE,
     
      							   LTA_MNT )
     
      							   --LTA_MNT_EUR )
     
    					    VALUES (
     
    					    	   CUR_TAB_AMO_REC.cnc_id,
     
    							   v_nb_lg_ech,
     
    							   CUR_TAB_AMO_REC.BCE_DEV_ECHEANCE_LDR,
     
    							   TO_DATE(CUR_TAB_AMO_REC.BCE_DT_ECHEANCE_LDR,cstFormatDate),
     
    							   DECODE(CUR_TAB_AMO_REC.BCE_SIGNE_MNT_LDR, cstSigneMntAmoDiminAutor, CUR_TAB_AMO_REC.BCE_MNT_ECHEANCE_LDR, cstSigneMntAmoAugmnAutor,CUR_TAB_AMO_REC.BCE_MNT_ECHEANCE_LDR * -1, NULL )
     
    							   -- trigger
     
    					    );
     
     
    						v_nb_insert := v_nb_insert + 1;
     
     
    			 END IF; -- Si la devise
     
    		 END IF; -- if v_continuer
     
          EXCEPTION
     
    	  WHEN OTHERS THEN
     
    		Pck_Log.PWrite_Error(v_package_name||'.pTabAmo','insertion du tableau du concours a echoue : '|| CUR_TAB_AMO_REC.id_genere);
     
    		Pck_Log.PWrite_Error(v_package_name||'.pTabAmo',SQLERRM);
     
    		v_nb_reject := v_nb_reject + 1;
     
    	  END;
     
      END LOOP;
     
      CLOSE CUR_TAB_AMO;
     
    	Pck_Log.PWrite_sep_tiret;
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Nombre de tableaux a charger               : '||TO_CHAR(v_nb_import));
     
    	Pck_Log.PWrite_sep_tiret;
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Nombre de tableaux inseres                 : '||TO_CHAR(v_nb_insert));
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Nombre de tableaux rejetes                 : '||TO_CHAR(v_nb_reject+v_nb_TAmoDtEchFrmIncorr+v_nb_TAmoDevNRensNExist+v_nb_TAmoSigneNRensNExist+v_nb_TAmoDtMntNRensNExist));
     
    	Pck_Log.PWrite_sep_tiret;
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Rejets -------------------------------------------');
     
    	Pck_Log.PWrite_sep_tiret;
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Nombre de format Date Ech incorr           : '||TO_CHAR(v_nb_TAmoDtEchFrmIncorr));
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Nombre de devise NRens ou NExist           : '||TO_CHAR(v_nb_TAmoDevNRensNExist));
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Nombre de signe  NRens ou NExist           : '||TO_CHAR(v_nb_TAmoSigneNRensNExist));
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Nombre de Date ou Montant NRens            : '||TO_CHAR(v_nb_TAmoDtMntNRensNExist));
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Nombre de rejets techniques (INSERT)       : '||TO_CHAR(v_nb_reject));
     
    	Pck_Log.PWrite_info;
     
     
     
      	Pck_Log.PClose;
     
     
     
      EXCEPTION
     
    	  WHEN OTHERS THEN
     
    		IF ((SQLCODE <= -20000) AND (SQLCODE > -21000)) THEN
     
    			RAISE;
     
    		ELSE
     
    			Pck_Log.PWrite_Error(v_package_name||'.pTabAmo',SQLERRM);
     
    			Pck_Log.PWrite_sep_tiret;
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Nombre de tableaux a charger               : '||TO_CHAR(v_nb_import));
     
    			Pck_Log.PWrite_sep_tiret;
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Nombre de tableaux inseres                 : '||TO_CHAR(v_nb_insert));
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Nombre de tableaux rejetes                 : '||TO_CHAR(v_nb_reject+v_nb_TAmoDtEchFrmIncorr+v_nb_TAmoDevNRensNExist+v_nb_TAmoSigneNRensNExist+v_nb_TAmoDtMntNRensNExist));
     
    			Pck_Log.PWrite_sep_tiret;
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Rejets -------------------------------------------');
     
    			Pck_Log.PWrite_sep_tiret;
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Nombre de format Date Ech incorr           : '||TO_CHAR(v_nb_TAmoDtEchFrmIncorr));
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Nombre de devise NRens ou NExist           : '||TO_CHAR(v_nb_TAmoDevNRensNExist));
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Nombre de signe  NRens ou NExist           : '||TO_CHAR(v_nb_TAmoSigneNRensNExist));
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Nombre de Date ou Montant NRens            : '||TO_CHAR(v_nb_TAmoDtMntNRensNExist));
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabAmo','-   Nombre de rejets techniques (INSERT)       : '||TO_CHAR(v_nb_reject));
     
    			Pck_Log.PWrite_info;
     
     
     
      			Pck_Log.PClose;
     
    		END IF;
     
    		CLOSE CUR_TAB_AMO;
     
    END pTabAmo;

    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
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
     
    PROCEDURE pTabRembOpe
     
    IS
     
    -- Tableaux des operation existantes dans PRISM
     
    CURSOR CUR_TAB_RMB IS
     
    	   SELECT  /*+ rule */ ope.OPE_CODE ope_code,
     
    	          ope.OPE_ID_BCE_GENERE id_genere,
     
      			  BCE_DEV_ECHEANCE_LDR  ,
     
      			  BCE_MNT_ECHEANCE_LDR  ,
     
      			  BCE_SIGNE_MNT_LDR     ,
     
      			  BCE_DT_ECHEANCE_LDR
     
    	   FROM   TTAB_REMBOURS_BCE_CV2_LDR ldr,
     
    	          TOPERATION ope
     
    	   WHERE  ldr.BCE_ID_GEN_OPE_LDR = ope.OPE_ID_BCE_GENERE
     
    	   ORDER BY ope_code,BCE_DT_ECHEANCE_LDR  ;
     
     
     
      CUR_TAB_RMB_REC 	CUR_TAB_RMB%ROWTYPE;
     
      v_continuer       BOOLEAN;
     
      v_dt_test         DATE;
     
      v_nb_lg_ech       INTEGER := 0;
     
      v_ope_code_preced   TOPERATION.OPE_CODE%TYPE := NULL;
     
     
      v_nb_TAmoDtEchFrmIncorr    INTEGER := 0;
     
      v_nb_TAmoDevNRensNExist    INTEGER := 0;
     
      v_nb_TAmoSigneNRensNExist  INTEGER := 0;
     
     
    BEGIN
     
      v_nb_import := 0;
     
      v_nb_reject := 0;
     
      v_nb_insert := 0;
     
      v_nb_initial := 0;
     
      -- ouverture du fichier de log si nécessaire
     
      Pck_Log.POPEN(NULL);
     
     
      IF Pck_Log.FIsOpen(NULL) = 0 THEN
     
             Pck_Log.PERROROPEN(v_package_name||'.pTabRembOpe');
     
      END IF;
     
      --Pck_Loader_Utl.write_info_file('pTabRembOpe',v_package_name);
     
      Pck_Log.PWrite_Sep;
     
      Pck_Log.PWrite_Info(v_package_name||'.pTabRembOpe');
     
     
     
      -- Traitement des tableaux des concours BCE existant dans PRISM
     
      OPEN CUR_TAB_RMB;
     
      LOOP
     
          FETCH CUR_TAB_RMB INTO CUR_TAB_RMB_REC;
     
          EXIT WHEN CUR_TAB_RMB%NOTFOUND;
     
    	  BEGIN
     
    		 v_nb_import := v_nb_import + 1;
     
     
     
    		 -- Test sur le format de la date d'echeance
     
    		 v_continuer := TRUE;
     
    		 BEGIN
     
    		     SELECT TO_DATE(CUR_TAB_RMB_REC.BCE_DT_ECHEANCE_LDR,cstFormatDate)
     
    			 into v_dt_test
     
    		     FROM DUAL;
     
    		 EXCEPTION
     
    	    	 WHEN OTHERS THEN
     
    	  	     PCK_ANOMALIE.pInsertAnomalieTabAmo( PCK_ANOMALIE.rejTRmbDtEchFrmIncorr, CUR_TAB_RMB_REC.id_genere, CUR_TAB_RMB_REC.BCE_DT_ECHEANCE_LDR );
     
    			 v_nb_TAmoDtEchFrmIncorr := v_nb_TAmoDtEchFrmIncorr + 1;
     
    			 v_continuer := FALSE;
     
    		 END;
     
    		 IF ( v_continuer )
     
    		 THEN
     
    		     -- Si la devise n'est pas renseignee ou n'existe pas dans le referentiel PRISM
     
    		 	 IF ( CUR_TAB_RMB_REC.BCE_DEV_ECHEANCE_LDR IS NULL OR Fct_Exist('TDEVISE','DEV_CODE', CUR_TAB_RMB_REC.BCE_DEV_ECHEANCE_LDR) = 0 )
     
    			 THEN
     
    	  	     	 PCK_ANOMALIE.pInsertAnomalieTabAmo( PCK_ANOMALIE.rejTRmbDevNRensNExist, CUR_TAB_RMB_REC.id_genere, CUR_TAB_RMB_REC.BCE_DEV_ECHEANCE_LDR );
     
    			 	 v_nb_TAmoDevNRensNExist := v_nb_TAmoDevNRensNExist + 1;
     
    			 -- Si le signe du montant est different de '1' ou '2'
     
    			 ELSIF ( CUR_TAB_RMB_REC.BCE_SIGNE_MNT_LDR IS NULL
     
    				     OR
     
    				    (CUR_TAB_RMB_REC.BCE_SIGNE_MNT_LDR IS NOT NULL AND CUR_TAB_RMB_REC.BCE_SIGNE_MNT_LDR NOT IN (cstSigneMntAmoDiminAutor,cstSigneMntAmoAugmnAutor))
     
    			       )
     
    			 THEN
     
    	  	     	  PCK_ANOMALIE.pInsertAnomalieTabAmo( PCK_ANOMALIE.rejTRmbSigneNRensNExist, CUR_TAB_RMB_REC.id_genere, CUR_TAB_RMB_REC.BCE_SIGNE_MNT_LDR );
     
    			 	  v_nb_TAmoSigneNRensNExist := v_nb_TAmoSigneNRensNExist + 1;
     
    			 ELSE
     
    	     	 	 -- Calcul du num‹ro de la ligne de tableau
     
    	     		 -- Si c'est la premiere operation
     
    	     		 IF ( v_ope_code_preced IS NULL )
     
    		 		 THEN
     
    		 	 	 	 v_ope_code_preced := CUR_TAB_RMB_REC.ope_code;
     
    		 	 		 v_nb_lg_ech := v_nb_lg_ech + 1;
     
    	             -- Si c'est le concours suivant
     
    	     		 ELSIF ( v_ope_code_preced IS NOT NULL AND v_ope_code_preced != CUR_TAB_RMB_REC.ope_code)
     
    		 		 THEN
     
    		 	 	 	 v_nb_lg_ech := 1;
     
    			 		 v_ope_code_preced := CUR_TAB_RMB_REC.ope_code;
     
    	     		 ELSE -- C'est toujurs le mˆme concours
     
    		 	  	 	 v_nb_lg_ech := v_nb_lg_ech + 1;
     
    		 		 END IF;
     
    						-- Insertion
     
    						INSERT INTO TECHEANCIER_OPE (
     
    				 			   OPE_CODE,
     
    							   EOP_LIGNE,
     
      							   EOP_ECHEANCE,
     
      							   DEV_CODE,
     
      							   EOP_MNT )
     
      							   --EOP_MNT_EUR
     
    					    VALUES (
     
    					    	   CUR_TAB_RMB_REC.ope_code,
     
    							   v_nb_lg_ech,
     
    							   TO_DATE(CUR_TAB_RMB_REC.BCE_DT_ECHEANCE_LDR,cstFormatDate),
     
    							   CUR_TAB_RMB_REC.BCE_DEV_ECHEANCE_LDR,
     
    							   DECODE(CUR_TAB_RMB_REC.BCE_SIGNE_MNT_LDR, cstSigneMntAmoDiminAutor, CUR_TAB_RMB_REC.BCE_MNT_ECHEANCE_LDR, cstSigneMntAmoAugmnAutor,CUR_TAB_RMB_REC.BCE_MNT_ECHEANCE_LDR * -1, NULL )
     
    							   -- trigger
     
    					    );
     
     
     
    						v_nb_insert := v_nb_insert + 1;
     
     
     
    			 END IF; -- Si la devise
     
    		 END IF; -- if v_continuer
     
          EXCEPTION
     
    	  WHEN OTHERS THEN
     
    			Pck_Log.PWrite_Error(v_package_name||'.pTabRembOpe','Insertion du tableau du concours a echoue : '|| CUR_TAB_RMB_REC.id_genere);
     
    			Pck_Log.PWrite_Error(v_package_name||'.pTabRembOpe',SQLERRM);
     
     
     
    		  	v_nb_reject := v_nb_reject + 1;
     
    	  END;
     
      END LOOP;
     
      CLOSE CUR_TAB_RMB;
     
     
     
    	Pck_Log.PWrite_sep_tiret;
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabRembOpe','-   Nombre de tableaux a charger               : '||TO_CHAR(v_nb_import));
     
    	Pck_Log.PWrite_sep_tiret;
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabRembOpe','-   Nombre de tableaux inseres                 : '||TO_CHAR(v_nb_insert));
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabRembOpe','-   Nombre de tableaux rejetes                 : '||TO_CHAR(v_nb_reject+v_nb_TAmoDtEchFrmIncorr+v_nb_TAmoDevNRensNExist+v_nb_TAmoSigneNRensNExist));
     
    	Pck_Log.PWrite_sep_tiret;
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabRembOpe','-   Rejets -------------------------------------------');
     
    	Pck_Log.PWrite_sep_tiret;
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabRembOpe','-   Nombre de format Date Ech incorr           : '||TO_CHAR(v_nb_TAmoDtEchFrmIncorr));
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabRembOpe','-   Nombre de devise NRens ou NExist           : '||TO_CHAR(v_nb_TAmoDevNRensNExist));
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabRembOpe','-   Nombre de signe  NRens ou NExist           : '||TO_CHAR(v_nb_TAmoSigneNRensNExist));
     
    	Pck_Log.PWrite_info(v_package_name||'.pTabRembOpe','-   Nombre de rejets techniques (INSERT)       : '||TO_CHAR(v_nb_reject));
     
    	Pck_Log.PWrite_info;
     
     
     
      Pck_Log.PClose;
     
     
     
      EXCEPTION
     
    	  WHEN OTHERS THEN
     
    		IF ((SQLCODE <= -20000) AND (SQLCODE > -21000)) THEN
     
    			RAISE;
     
    		ELSE
     
    			Pck_Log.PWrite_Error(v_package_name||'.pTabRembOpe',SQLERRM);
     
    			Pck_Log.PWrite_sep_tiret;
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabRembOpe','-   Nombre de tableaux a charger               : '||TO_CHAR(v_nb_import));
     
    			Pck_Log.PWrite_sep_tiret;
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabRembOpe','-   Nombre de tableaux inseres                 : '||TO_CHAR(v_nb_insert));
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabRembOpe','-   Nombre de tableaux rejetes                 : '||TO_CHAR(v_nb_reject+v_nb_TAmoDtEchFrmIncorr+v_nb_TAmoDevNRensNExist+v_nb_TAmoSigneNRensNExist));
     
    			Pck_Log.PWrite_sep_tiret;
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabRembOpe','-   Rejets -------------------------------------------');
     
    			Pck_Log.PWrite_sep_tiret;
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabRembOpe','-   Nombre de format Date Ech incorr           : '||TO_CHAR(v_nb_TAmoDtEchFrmIncorr));
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabRembOpe','-   Nombre de devise NRens ou NExist           : '||TO_CHAR(v_nb_TAmoDevNRensNExist));
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabRembOpe','-   Nombre de signe  NRens ou NExist           : '||TO_CHAR(v_nb_TAmoSigneNRensNExist));
     
    			Pck_Log.PWrite_info(v_package_name||'.pTabRembOpe','-   Nombre de rejets techniques (INSERT)       : '||TO_CHAR(v_nb_reject));
     
    			Pck_Log.PWrite_info;
     
     
     
      			Pck_Log.PClose;
     
    		END IF;
     
    		CLOSE CUR_TAB_RMB;
     
    END pTabRembOpe;

  10. #90
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Aller, réflexion à chaud sur la 1° :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	   SELECT  /*+ rule */cnc.CNC_ID cnc_id,
    	          cnc.CNC_ID_BCE_GENERE id_genere,
    			  BCE_DEV_ECHEANCE_LDR,
      			  BCE_MNT_ECHEANCE_LDR,
      			  BCE_SIGNE_MNT_LDR,
      			  BCE_DT_ECHEANCE_LDR
    	   FROM   TTAB_AMO_BCE_CV2_LDR ldr,
    	          TCONCOURS cnc
    	   WHERE  ldr.BCE_ID_GEN_CNC_LDR = cnc.CNC_ID_BCE_GENERE
     	   ORDER BY cnc_id,BCE_DT_ECHEANCE_LDR  ;
    Pourquoi un hint RULE ? Que donne le plan d'exécution, combien de temps dure la requête et combien de lignes retournent-elle ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       LOOP
           FETCH CUR_TAB_AMO INTO CUR_TAB_AMO_REC;
           EXIT WHEN CUR_TAB_AMO%NOTFOUND;
     	  BEGIN
     		 v_nb_import := v_nb_import + 1;
     		 -- Test sur le format de la date d'echeance
     		 v_continuer := TRUE;
     		 BEGIN
     		     SELECT TO_DATE(CUR_TAB_AMO_REC.BCE_DT_ECHEANCE_LDR,cstFormatDate)
     			 INTO v_dt_test
     		     FROM DUAL;
    pourquoi ne pas l'inclure dans la requête du curseur, là tu exécutes x fois cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     	  	     	 PCK_ANOMALIE.pInsertAnomalieTabAmo( PCK_ANOMALIE.rejTAmoDevNRensNExist, CUR_TAB_AMO_REC.id_genere, CUR_TAB_AMO_REC.BCE_DEV_ECHEANCE_LDR );

    J'imagine que ça fait une insertion en base, y'a pas moyen de faire un INSERT SELECT [le curseur] + conditions ?

    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
     						INSERT INTO TTAB_AMO (
     				 			   CNC_ID,
       							   LTA_LIGNE,
       							   DEV_CODE,
       							   LTA_ECHEANCE,
       							   LTA_MNT )
       							   --LTA_MNT_EUR )
     					    VALUES (
     					    	   CUR_TAB_AMO_REC.cnc_id,
     							   v_nb_lg_ech,
     							   CUR_TAB_AMO_REC.BCE_DEV_ECHEANCE_LDR,
     							   TO_DATE(CUR_TAB_AMO_REC.BCE_DT_ECHEANCE_LDR,cstFormatDate),
     							   DECODE(CUR_TAB_AMO_REC.BCE_SIGNE_MNT_LDR, cstSigneMntAmoDiminAutor, CUR_TAB_AMO_REC.BCE_MNT_ECHEANCE_LDR, cstSigneMntAmoAugmnAutor,CUR_TAB_AMO_REC.BCE_MNT_ECHEANCE_LDR * -1, NULL )
     							   -- trigger
     					    );
    qu'est ce qui empêche de le remplacer par :
    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
     						-- Insertion
     						INSERT INTO TTAB_AMO (
     				 			   CNC_ID,
       							   LTA_LIGNE,
       							   DEV_CODE,
       							   LTA_ECHEANCE,
       							   LTA_MNT )
       							   --LTA_MNT_EUR )
    	   SELECT cnc.CNC_ID cnc_id,
    	          COUNT([à voir avec fonction analytique])
    			  BCE_DEV_ECHEANCE_LDR,
      			  TO_DATE(BCE_DT_ECHEANCE_LDR,cstFormatDate),
      			  DECODE(CUR_TAB_AMO_REC.BCE_SIGNE_MNT_LDR, cstSigneMntAmoDiminAutor, CUR_TAB_AMO_REC.BCE_MNT_ECHEANCE_LDR, cstSigneMntAmoAugmnAutor,CUR_TAB_AMO_REC.BCE_MNT_ECHEANCE_LDR * -1, NULL )
    	   FROM   TTAB_AMO_BCE_CV2_LDR ldr,
    	          TCONCOURS cnc
    	   WHERE  ldr.BCE_ID_GEN_CNC_LDR = cnc.CNC_ID_BCE_GENERE
     	   ORDER BY cnc_id,BCE_DT_ECHEANCE_LDR  ;
    Comme je craignais, un insert unitaire dans un LOOP doit être éviter. Il est forcément plus performant d'insérer 10000000 lignes plutôt que 10000000 de fois une seule ligne

  11. #91
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    On peut faire les mêmes remarques pour le 2°.

    Après faudrait voir plus en détail évidemment mais déjà quand je vois un INSERT dans un parcours de curseurs sans réelle "intelligence" avant cet insert je me dis qu'il y a un souci

  12. #92
    Membre régulier
    Inscrit en
    Septembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 73
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par farenheiit Voir le message
    voici les temps d'executions:
    code java => 17h37-18h54

    Hum hum comme quoi on peut être mauvaise langue...

  13. #93
    Membre régulier
    Inscrit en
    Septembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 73
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par farenheiit Voir le message
    voici les temps d'executions:
    Analyze schéma => 45 min
    PCK_LOADER_UTL.PGlobal_import => 16h57-11h25
    PCK_LOADER_UTL.PGlobal_import_fin_chgt => 11h25-16h31
    pck_loader_pool.pCHARGE_POOL_PME => 16h31-17h37
    code java => 17h37-18h54

    on se rend compte que la proc qui coûte le plus est PCK_LOADER_UTL.PGlobal_import

    voici son contenu:
    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
     
    PROCEDURE PGlobal_import(Indate IN DATE DEFAULT NULL)
    is
    id  UTL_FILE.FILE_TYPE ;
     
     v_sessionid	NUMBER;
     
     v_termninal	VARCHAR2(50);
     
     v_entryid	VARCHAR2(50);
     
     v_user		VARCHAR2(50);
     
     v_uid		NUMBER;
     
    BEGIN
     
      BEGIN
     
    	SELECT USERENV('SESSIONID'),USERENV('TERMINAL'),USERENV('ENTRYID'), USER,UID
     
    	INTO v_sessionid,v_termninal,v_entryid,v_user,v_uid
     
    	FROM dual;
     
      EXCEPTION
     
       WHEN OTHERS THEN
     
       	NULL;
     
      END;
     
    DBMS_OUTPUT.put_line('DATE : '||TO_CHAR(SYSDATE,'DD/MM/YYYY HH24:MM'));
     
    DBMS_OUTPUT.put_line('USER : '||v_user);
     
    DBMS_OUTPUT.put_line('UID : '||TO_CHAR(v_uid));
     
    DBMS_OUTPUT.put_line('SESSIONID : '||v_sessionid);
     
    DBMS_OUTPUT.put_line('TERMINAL : '||v_termninal);
     
    DBMS_OUTPUT.put_line('ENTRYID : '||v_entryid);
     
    --  Vidage dans ttransaction
     
    EXECUTE IMMEDIATE ' truncate table TIND_TRANSACTION';
     
    -- UTILISATION DU ROLLBACK SEGMENT LARGE_RS
     
    ----DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    Pck_Loader_Utl.date_import(Indate);
     
     
    COMMIT;
     
    -- Chargement des classes secteurs
     
    Pck_Loader_Utl.transfert_data('TCLS_SECTEUR_LDR','TCLS_SECTEUR');
     
    COMMIT;
     
    -- chargement des tables de référence
     
    pck_loader_ref.pGlobalREF;
    COMMIT;
     
    --DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    -- chargement des notes des clients
     
    --Pck_Loader_Ref.notation;
     
    -- 20060703 AAAN V3.4 Appel du nouveau package d'intégration des notations
     
    Pck_Loader_INTA.PGlobalINTA;
     
    COMMIT;
     
    -- UTILISATION DU ROLLBACK SEGMENT LARGE_RS
     
    --DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    PCK_LOADER_CNC_CME.PDelete_CME_CONC;
     
    COMMIT;
     
    -- UTILISATION DU ROLLBACK SEGMENT LARGE_RS
     
    --DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    --PCK_LOADER_CNC_CME.pOPM_CME;
     
    --PCK_LOADER_CNC_CME.PRCM_MC2;
     
    PCK_LOADER_CNC_CME.pcharge_opemar;
     
    COMMIT;
     
    PCK_LOADER_BCE.PGLOBALBCE;
     
    -- chargement des activités
     
    --DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    pck_loader_ref.PLOAD_ACTIVITE;
     
    commit;
     
    --chargement des pools retails
     
    --DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    PCK_LOADER_POOL.PCHARGE_POOL_RETAIL;
     
    COMMIT;
     
    --chargement des pools PME
     
    /*--DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    PCK_LOADER_POOL.PCHARGE_POOL_PME;
     
    COMMIT;*/
     
    --chargement concours mc2
     
    --DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    PCK_LOADER_CNC_MC2.pDeleteCncMC2;
     
    COMMIT;
     
    --chargement concours mc2
     
    --DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
    PCK_LOADER_CNC_MC2.PINSERTMC2;
     
    COMMIT;
     
    -- chargement des Collateraux NY
     
    -- PCK_IMPORT_NY.pLoadCollateralNY;
     
    COMMIT;
     
    --chargement des CDO
     
    --DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('LARGE_RS');
     
     pck_loader_cdo.PGLOBALCDO;
     
    COMMIT;
     
    --DBMS_OUTPUT.put_line('fin chargement bce, chargement des Dc a venir');
    -- Chargement des CDS
     
    Pck_Loader_CDS.PGlobalCDS;
     
    commit;
     
    END PGlobal_import;
    dans cette proc les packages les plus couteux sont:
    PCK_LOADER_BCE.pConcours => + de 3h
    PCK_LOADER_BCE.pOperation => + de 1h
    PCK_LOADER_BCE.pTabAmo => - de 5h
    PCK_LOADER_BCE.pTabRembOpe => - de 5h
    PCK_LOADER_BCE.pGarantie => 1h

    donc les 2 procs PCK_LOADER_BCE.pTabAmo et PCK_LOADER_BCE.pTabRembOpe sont les plus couteuses et sont donc celles à optimiser en 1er
    Toutes ces packages ne sont pas dans PCK_LOADER_UTL.PGlobal_import (J'ai loupé quelque chose ?)

  14. #94
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Il faut la trace pour être sûr qu'on a les bonnes requêtes; la trace nous donnera les plans d'exécutions, les volumes manipulés, les temps d'exécutions des requêtes et les temps d'attente internes et externes.

    La trace ce n'est PAS la commande ps.

    C'est un fichier créé ici par oradebug dans le répertoire donné par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    show parameter user_dump_dest
    Ce fichier est-il créé ?
    Quel est son rythme de croissance ?
    Est-il régulièrement mis à jour ?

  15. #95
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Je reste toujours persuadé que le problème vient du grand nombre de requêtes unitaires qui est fait... d'après statspack, il n'y a aucun souci et la trace montrera la même chose... tout simplement parce que le problème c'est pas de lancer les requêtes mais de les exécuter des millions de fois. Le "stress" des logs semblent confirmer cette théorie.

    mais personne m'écoute ici


  16. #96
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Points : 341
    Points
    341
    Par défaut
    Toutes ces packages ne sont pas dans PCK_LOADER_UTL.PGlobal_import (J'ai loupé quelque chose ?)
    effectivement toutes ces proc sont appelées dans PCK_LOADER_BCE.PGLOBALBCE qui est appelé depuis PCK_LOADER_UTL.PGlobal_import

    Pourquoi un hint RULE ?
    je ne sais pas ce n'est pas moi qui ait ecrit ce code. mais je pense que le développeur voyait qu'en mode COUT l'index n'était pas pris en compte. Et effectivement c'est le cas quand on regarde le plan d'execution:

    Que donne le plan d'exécution
    sans le hint:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Operation	Object Name	Rows	Bytes	Cost	TQ	In/Out	PStart	PStop
     
    SELECT STATEMENT Hint=CHOOSE		16 M	 	58562  	 	      	             	 
      SORT ORDER BY		16 M	485 M	58562  	 	      	             	 
        HASH JOIN		16 M	485 M	11018  	 	      	             	 
          TABLE ACCESS FULL	TCONCOURS	490 K	4 M	956  	 	      	             	 
          TABLE ACCESS FULL	TTAB_AMO_BCE_CV2_LDR	16 M	328 M	3292
    avec le hint:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT STATEMENT Hint=HINT: RULE		  	 	 	 	      	             	 
      SORT ORDER BY		  	 	 	 	      	             	 
        TABLE ACCESS BY INDEX ROWID	TTAB_AMO_BCE_CV2_LDR	  	 	 	 	      	             	 
          NESTED LOOPS		  	 	 	 	      	             	 
            TABLE ACCESS FULL	TCONCOURS	  	 	 	 	      	             	 
            INDEX RANGE SCAN	IDX_BCE_ID_GEN_CNC_TABAMO_LDR
    combien de temps dure la requête et combien de lignes retournent-elle ?
    la requête dure 55 secondes et retourne 5 648 854 lignes

    en fait je me rend compte que j'ai pris le problème par le mauvais bout. comme l'a dit Pifor, il faut d'abord commencer par tuner le côté applicatif avant de s'attaquer au produit Oracle et à la mémoire.

  17. #97
    Membre régulier
    Inscrit en
    Septembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 73
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Je reste toujours persuadé que le problème vient du grand nombre de requêtes unitaires qui est fait... d'après statspack, il n'y a aucun souci et la trace montrera la même chose... tout simplement parce que le problème c'est pas de lancer les requêtes mais de les exécuter des millions de fois. Le "stress" des logs semblent confirmer cette théorie.

    mais personne m'écoute ici

    Hum hum j'avais pas parlé de l'effet mass ? (Le nombre d'execute revele ça immediatement !!!)

  18. #98
    Membre régulier
    Inscrit en
    Septembre 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 73
    Points : 82
    Points
    82
    Par défaut
    Et le seul moyen quand on est sur de la logique du prog (ce qui n'est pas le cas ici) c'est le superdome !!! (Allez si tu es gentil je te vendrai du CPU... )

  19. #99
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par farenheiit Voir le message
    je ne sais pas ce n'est pas moi qui ait ecrit ce code. mais je pense que le développeur voyait qu'en mode COUT l'index n'était pas pris en compte. Et effectivement c'est le cas quand on regarde le plan d'execution:
    Il y a peut-être bien un souci dans le calcul des stats du cout non ?

    Il porte sur quelles colonnes l'index ?

    Citation Envoyé par farenheiit Voir le message
    la requête dure 55 secondes et retourne 5 648 854 lignes
    Bientôt 6 millions de fois tous les morceaux de code... cherche plus... le problème est là

  20. #100
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par Tracnac Voir le message
    Et le seul moyen quand on est sur de la logique du prog (ce qui n'est pas le cas ici) c'est le superdome !!! (Allez si tu es gentil je te vendrai du CPU... )
    même pas, les disques ne suivront pas notamment les logs

Discussions similaires

  1. Outils d'interprétation des rapports STATSPACK
    Par alexisongagna dans le forum Outils
    Réponses: 0
    Dernier message: 31/01/2013, 14h46
  2. Interpréter un rapport statspack ou AWR
    Par yanis97 dans le forum Oracle
    Réponses: 23
    Dernier message: 16/01/2012, 17h20
  3. hijackthis : interprétation du rapport
    Par erwann9 dans le forum Sécurité
    Réponses: 3
    Dernier message: 11/10/2006, 22h44
  4. Réponses: 1
    Dernier message: 07/10/2005, 10h44

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