Bonjour,

je suis sous oracle 9.2.0.4. Depuis plusieurs jours nous avons un batch qui "a priori" tourne mais ne se termine pas. Il reste bloqué sur une procédure stockée :
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
 
PROCEDURE X
  (
    p_dt_min IN DATE,
    p_dt_max IN DATE
  ) IS
 
    -- Curseur de recherche des operations dans la table de reporting
    CURSOR c1 IS
      SELECT DISTINCT a
        FROM tab1
       ORDER BY a;
 
    -- Curseur de recherche des UO traitantes dans la table de reporting
    CURSOR c2(p_a tab3.a%TYPE) IS
      SELECT DISTINCT b
        FROM tab1
       WHERE a = p_a;
 
    -- Curseur de recherche des UO traitee dans la table de reporting
    CURSOR c3(p_a tab3.a%TYPE, p_b tab3.b%TYPE) IS
      SELECT DISTINCT c
        FROM tab1
       WHERE a = p_a
         AND b = p_b;
 
    rec1 c1%ROWTYPE;
    rec2 c2%ROWTYPE;
    rec3 c3%ROWTYPE;
 
 
 
  BEGIN
 
    -- Vidage de la table temporaire de calcul des moyennes mobiles tab2
    truncate_table('tab2');
    -- Suppression des index de la table tab2
    drop_table_index('index_tab2');
 
    -- Boucle sur le colonne a
    FOR rec1 IN c1
    LOOP
 
      -- Boucle sur colonne b
      FOR rec2 IN c2(rec1.a)
      LOOP
 
        -- Boucle sur colonne c
        FOR rec3 IN c3(rec1.a, rec2.b)
        LOOP
 
          INSERT INTO tab2
            (date_a
            ,b
            ,a
            ,c
            ,d_mym
            ,e_mym
            ,f_mym
            ,g_mym
            ,h_mym
            ,i_mym
            ,j_mym
            ,k_mym
            ,l_mym
            ,m_mym)
            SELECT date_a,
                   b,
                   a,
                   c,
                   AVG(SUM(d)) over(ORDER BY date_a rows cst_nbmm preceding) AS em,
                   AVG(SUM(e)) over(ORDER BY date_a rows cst_nbmm preceding) AS sm,
                   AVG(SUM(d - e)) over(ORDER BY date_a rows cst_nbmm preceding) AS dm,
                   AVG(SUM(g)) over(ORDER BY date_a rows cst_nbmm preceding) AS debm,
                   AVG(SUM(h)) over(ORDER BY date_a rows cst_nbmm preceding) AS finm,
                   AVG(SUM(d * nvl(n, 0))) over(ORDER BY date_a rows cst_nbmm preceding) AS uem,
                   AVG(SUM(e * nvl(o, 0))) over(ORDER BY date_a rows cst_nbmm preceding) AS usm,
                   AVG(SUM((d - e) * nvl(p, 0))) over(ORDER BY date_a rows cst_nbmm preceding) AS udm,
                   AVG(SUM(g * nvl(p, 0))) over(ORDER BY date_a rows cst_nbmm preceding) AS udebm,
                   AVG(SUM(h * nvl(p, 0))) over(ORDER BY date_a rows cst_nbmm preceding) AS ufinm
              FROM tab3 t
             WHERE a = rec1.a
               AND b = rec2.b
               AND nvl(c, ' ') = nvl(rec3.c, ' ')
               AND date_a >= p_dt_min
               AND date_a <= p_dt_max
             GROUP BY date_a,
                      b,
                      a,
                      c;
 
 
        END LOOP;
 
        COMMIT;
 
      END LOOP;
 
    END LOOP;
 
 
    -- Creation de l'index index_tab2 = a, b, c, date_a sur la table tab2
    create_table_index('index_tab2',
                       'tab2',
                       'a,b,c,date_a');
 
  EXCEPTION
    WHEN OTHERS THEN
      lblmsg := 'ERREUR ORACLE : ' || to_char(SQLCODE) || ' : ' || SQLERRM;
      --ecriture message d erreur
      RAISE;
 
  END X;
J'ai demandé un plan d'éxecution à la dba et voilà ce qu'elle me transmets :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
CHILD_NUMBER   ID PARENT OPERATION                           OBJECT_NAME                              FILTER_PREDICATES
------------ ---- ------ ----------------------------------- ---------------------------------------- ------------------------------
           0    0        INSERT STATEMENT
                1      0 WINDOW BUFFER
                2      1 SORT GROUP BY NOSORT
                3      2 FILTER                                                                       :B2<=:B1
                4      3 TABLE ACCESS BY INDEX ROWID         tab3
                5      4 INDEX RANGE SCAN                    index_tab2                                "a"=:B5 AND "b"=:B4 AND NVL("c",' ')=NVL(:B3,' ')
Je ne mis connais pas des masses, si ce n'est pas du tout, j'ai lu pas mal de post ce matin ainsi que l'url : http://www.developpez.net/forums/forumdisplay.php?f=42

Il me semble que le niveau de trace de ce plan ne nous apprends pas grand chose, est ce que je me trompe?

J'ai demandé le niveau de la trace, j'attends une réponse.

Pourriez vous me conseiller?

merci par avance pour tt les réponses