Bonjour,
je me demande, pour une requête semblable, si il y a une différence de performances entre l'utilisation de la syntaxe "Decode" ou de la syntaxe "Case When"...
des idées ?
Bonjour,
je me demande, pour une requête semblable, si il y a une différence de performances entre l'utilisation de la syntaxe "Decode" ou de la syntaxe "Case When"...
des idées ?
D'abord, il faut bien voir que le CASE est bien plus puissant que le DECODE donc, il faut comparer ce qui est comparable à savoir la seul fonction de retourner une valeur selon la valeur d'une colonne (ou variable)
dans ce cas dans la 9i c'est pareil mais en 8i le CASE peut être moins performant.
http://asktom.oracle.com/pls/ask/f?p=4950:8:16367464451358143734::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:1243867216406,
Comme le dit ce cher Tom Kyte, le CASE est surtout beaucoup plus facile à lire et donc à maintenir![]()
ok merci...
dans mon cas (9.2.0.5) c'est quelque chose comme (une colonne du Select)donc ma question porte surtout sur le sous-select imbriqué dans la clause THEN... est-ce qu'il va être interprété la même chose et au même moment si je fais
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Case when A = B then (Select C From...) Else D End as maColonne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Decode ( A , B , (Select C From...) , D ) as maColonne
A mon avis, il y a bien plus performant à faire, je pense que si tu sors la table et les clauses de la sous-requête pour les mettre dans ta requête principale ça sera bcp mieux...
Par ex :
pourrait être :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT (Case when A = B then (Select C From tab2 WHERE ...) Else D End) as maColonne FROM tab1
Enfin, faudrait voir sur un exemple mais je pense que ça doit être jouable
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SELECT (Case when A = B then tab2.C Else D End) as maColonne FROM tab1,tab2 WHERE...![]()
c'est pas évident, le sous select qui est dans le case est lui-même composé de 6 sous select...
bah là, j'peux dire sans trop de doute que ça sera très probablement anti-perf
Même si la requête est complexe, il faut absolument éviter les sous-requêtes de sous-requête de sous... etc...![]()
oui je sais, mais là j'ai pas eu le choix...
j'ai essaye de mettre les conditions qui provoque mon Case When dans le where et de régler ça avec des jointures, mais dans ce cas je me trouve avec un haut niveau de récursivité dans le Select, c'est à dire qu'il doit "se tester sur lui-même" en permanence avant de décider quoi me retourner...
=> en bref avec les jointures j'ai plus de 40 minutes de traitement et avec le Case j'arrive à 16 minutes...
Bon, je connais pas la requête et je veux bien croire que les sous-requêtes soit performantes, mais pour répondre à la question... le DECODE n'y changera rien
![]()
Partager