
Envoyé par
pifor
SheikYerbouti a raison au sujet de l'utilisation ou non de l'index. L'index ne sera pas utilisé seulement si la clause WHERE ne contient que cette condition là:
[...]
Je suis completement perdu
Visiblement tout le monde est d'accord pour dire que l'index sera utilisé (sauf si colonne IS NULL ).
J'ai encore fait des tests ce matin sur plusieures tables (65000 enregistrements et 580000 enregistrement) en me basant uniquement sur une recherche sur un champ indexé (sur l'exemple ce n'etait pas une clé primaire mais j'ai fait la même chose sur une table et sa clé primaire et les résultats sont du même style).
Les résultats sont les suivants :
(en donnant une valeur non nulle et <>-1 à :pi_id_art)
Avec une syntaxe :
Temps d'execution de la recherche : 31ms
Operation Object Name Rows Bytes Cost
SELECT STATEMENT Optimizer Mode=CHOOSE 10 1
INDEX RANGE SCAN M2DBA.T_580000_ENREG_IDX 10 40 1
Avec une syntaxe :
where (:pi_id_art = -1 or id_art=:pi_id_art )
Temps d'execution de la recherche : 2s
Operation Object Name Rows Bytes Cost
SELECT STATEMENT Optimizer Mode=CHOOSE 27 K 3
INDEX FAST FULL SCAN M2DBA.T_580000_ENREG_IDX 27 K 107 K 3
avec la même syntaxe mais sur une autre table plus petite (65000 enreg), il faisait même un TABLE FULL SCAN
Avec une syntaxe :
where id_art=decode(:pi_id_art, -1, id_art,:pi_id_art)
Temps d'execution de la recherche : 46ms
Operation Object Name Rows Bytes Cost
SELECT STATEMENT Optimizer Mode=CHOOSE 552 K 4
CONCATENATION
FILTER
INDEX FAST FULL SCAN M2DBA.T_580000_ENREG_IDX 10 40 1
FILTER
INDEX RANGE SCAN M2DBA.T_580000_ENREG_IDX 10 40 1
Il semblerait donc que la solution la moins performante soit celle avec le "or" (utilisation de l'index mais en FULL SCAN sur l'index)
Je suis vraiment le seul a avoir ces résultats et il faut que je regarde ce qui se passe du coté de l'administration de la base ou il y a autre chose ?!?!?
Partager