Bonjour,
J'ai un problème de performance dans une requête, manifestement lié à l'utilisation d'un type.
Je dois faire un grand nombre de tests dans une requete (j'utilise CASE WHEN ... THEN ... ).
Je travaille sur une base Oracle 10g.
Pour faire mes tests, je compare les champs de la requete à des valeurs d'un type 'Constantes' déclaré comme suit :
Je n'en mets qu'une partie, mais j'ai une trentaine de constantes définies dans ce type.
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 CREATE OR REPLACE Type Constantes AS object( -- Statuts svg/communs OK VARCHAR2(16), KO VARCHAR2(16), CONSTRUCTOR FUNCTION Constantes RETURN SELF AS RESULT ) / CREATE OR REPLACE Type BODY Constantes AS CONSTRUCTOR FUNCTION Constantes RETURN SELF AS RESULT IS BEGIN self.OK := 'OK'; self.KO := 'KO'; RETURN ; END; END; /
Lorsque j'augmente le nombre de " WHEN MonChamps = Constantes().Valeur " dans ma requête, les performances sont en chute libre.
Pour une quarantaine de tests, l'exécution passe à une dizaine de secondes, tandis qu'elle met 200ms si je remplace les Constantes().Valeur par sa valeur en dur dans la requête.
Je précise que la requete ne ramène qu'une ligne.
Autre détail : avec un shared_pool_size à 128M, la requete utilisant les types plante si je lui demande le plan d'execution (ORA-04031: impossible d'affecter 808 octets de mémoire partagée).
En augmentant le shared_pool_size à 256, l'affichage du plan d'execution se fait, mais prends une trentaine de secondes.
Tout est instantané avec la requete qui n'utilise pas les types.
Je travaille sur une base de dev, donc rien d'autre ne tourne.
Je serai tenté d'en conclure que l'utilisation que je fais des types est bien trop gourmande en mémoire.
Je vous mets un ou deux tests pour la route, mettre la totalité ne servirait à rien :
Qui équivaut à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 WHEN StatutEtape1 = Constantes().OK THEN Constantes().OK WHEN StatutEtape1 = Constantes().KO THEN Constantes().KO
J'utilise un type pour pouvoir modifier à tout moment la valeur testée sans modifier toutes mes requetes. Pour prendre un exemple bidon, si un jour l'utilisateur décide de me renvoyer 'KOTechnique' au lieu de 'KO', j'aimerai n'avoir à changer que mon type.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 WHEN StatutEtape1 = 'OK' THEN 'OK' WHEN StatutEtape1 = 'KO' THEN 'KO'
Donc, je me pose deux questions :
- Est-ce que j'utilise correctement les types, ou est-ce que je fais quelque chose de travers qui expliquerait ces mauvaises performances?
- Sinon, voyez vous une autre solution plus efficace que l'utilisation de types pour déclarer mes constantes?
Merci d'avance!
Partager