Bonjour,

Je fais face à un problème assez inattendu.

Voici une partie de 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
DECLARE
    v_code      VARCHAR2 (24);
    v_count   NUMBER;
BEGIN
    v_code := '4.1214';
 
    SELECT   COUNT ( * )
      INTO   v_count
       FROM   customer cu, contract ca, contract_status cgtf
     WHERE       cu.code LIKE v_code
             AND ca.customer_id = cu.customer_id
             AND ca.co_id = cgtf.co_id
             AND ch_status IN ('a', 's');
 
    DBMS_OUTPUT.put_line (v_count);
END;
Et une copie de celui-ci, la seule différence se situe dans le fait que je n'utilise pas de variable, mais la valeur en brut dans 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
DECLARE
    v_code      VARCHAR2 (24);
    v_count   NUMBER;
BEGIN
    v_code := '4.1214';
 
    SELECT   COUNT ( * )
      INTO   v_count
       FROM   customer cu, contract ca, contract_status cgtf
     WHERE       cu.code LIKE '4.1214'
             AND ca.customer_id = cu.customer_id
             AND ca.co_id = cgtf.co_id
             AND ch_status IN ('a', 's');
 
    DBMS_OUTPUT.put_line (v_count);
END;
Mon soucis est celui-ci. Pour la première requête, le temps d'exécution est de 119 sec, la seconde : 0.015 seconde.

Sachant que cette requête est appelée dans une boucle pouvant aller jusque 30.000 codes, la différence de performance est énorme.

(Notez, j'utilise un LIKE car normalement il y a '%' à la fin, mais je ne l'utilise pas pour l'exemple, le résultat est semblable et n'est donc pas en cause).

Notez aussi que le type VARCHAR2(24) utilisé pour ma variable v_code est le même que celui défini dans la table Customer pour mon cu.code.

Qu'est-ce qui peut causer cela? Quelle serait la solution pour garder autant de performance avec une variable?

Un grand merci d'avance.

Merci à vous.