Bonjour,
Je fais face à un problème assez inattendu.
Voici une partie de code.
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 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;
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.
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;
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.
Partager