Bonjour,
j'ai un gros problème sur l'environnement de production que je n'arrive pas à reproduire sur l'environnement de développement, je soupçonne donc un conflit avec d'autres transactions sur la base de données.
Le traitement qui est lancé à travers un script unix en batch (avec la commande at ...) est fortement ralenti lors de la lecture d'un curseur de ce style :
dans une boucle :CURSOR CUR_cre_fact (
p_aff_deb AFFILIES.AFF_NAFF%TYPE,
p_aff_fin AFFILIES.AFF_NAFF%TYPE,
p_ANNEE AFF_COMPTA_LPP.COA_ANNE%TYPE,
p_PEIO AFF_COMPTA_LPP.COA_PEIO%TYPE,
p_debut_fact VARCHAR2,
p_type_fac IP_METIER_ID_NUMERO_METIER.TYPE_FACTURATION%TYPE)
IS
SELECT a.uuid_consolide,
a.metier_id,
NVL (b.montant_annuel, 0) montant_annuel,
c.type_facturation,
d.aff_sequ,
d.aff_no,
d.aff_dlrd
FROM table_a a
JOIN table_b b
ON b.parent_send_mont_fact_uuid = a.uuid
JOIN table_c c
ON c.metier_id = a.metier_id
JOIN table_d d.aff_no = c.numero_metier
WHERE a.TRAITE IS NULL
AND d.aff_no BETWEEN p_aff_deb AND p_aff_fin
AND a.module_name = 'IIII'
AND a.type_objet_facturable = 'OBJET_FACT_UB_FACTURATION'
AND b.debut_facturation LIKE p_debut_fact
AND c.type_Facturation = p_type_Fac
GROUP BY a.uuid_consolide,
a.metier_id,
b.montant_annuel,
c.type_facturation,
d.aff_sequ,
d.aff_no,
d.aff_dlrd
ORDER BY d.aff_no
Le traitement est pratiquement stoppé en début de lecture, j'ai mis un traitement d'audit juste dans le premier passage (lecture du premier record) qui ne se fait pas.FOR row_cre_fact IN cur_cre_fact (p_aff_deb,
p_aff_fin,
p_annee,
p_peio,
v_debut_fact,
p_type_Fac)
LOOP
--traitement d'audit
Ce qui est très surprenant, c'est que lorsque :
-> je lance ce batch sur l'environnement développement, le résultat est inférieur à la minute.
-> j'exécute la requête sql du curseur dans TOAD, le résultat est aussi très rapide sur l'environnement de production, je ne vois aucun blocage.
-> je lance l'exécution du package dans TOAD, le résultat est aussi inférieur à la minute sur l'environnement de production !
La méthode pour se connecter à la base oracle depuis le script unix :
Il m'est impossible de monitorer en production pour l'instant, je ne suis pas le dba (qui est quelque peu occupé en ce moment).sqlplus -S /nolog << _EOF
connect $LOGNAME/$HOT_PH_PASS@$ORACLE_SID;
DECLARE
P_AFF_NAFF_DEB NUMBER;
P_AFF_NAFF_FIN NUMBER;
P_COA_ANNE NUMBER;
P_COA_PEIO NUMBER;
P_DATE_FAC DATE;
P_DATE_ECH DATE;
P_TYPE_FAC VARCHAR2(255);
P_USE_VISA VARCHAR2(200);
P_PRINTER VARCHAR2(30);
BEGIN
P_AFF_NAFF_DEB := TO_NUMBER($P_AFF_NAFF_DEB);
P_AFF_NAFF_FIN := TO_NUMBER($P_AFF_NAFF_FIN);
P_COA_ANNE := TO_NUMBER($P_COA_ANNE);
DB.PCK_MYPACKAGE.P_MA_PROCEDURE ( P_AFF_NAFF_DEB, P_AFF_NAFF_FIN, P_COA_ANNE,..);
END;
/
_EOF
Donc merci d'avance si vous avez quelques pistes pour peut-être configurer le même mode d'exécution entre le batch et le TOAD (transaction, autres?), voire si vous avez d'autres idées.
Partager