[Oracle] Gestion des index

Gestion des index [Oracle] - SQL/NoSQL - Programmation

Marsh Posté le 19-11-2009 à 16:05:55    

Bonjour tout le monde,  
 
J'ai un petit problème d'index sur une base Oracle :  
J'ai une table qui contient une 20 aine de champs, une clé primaire ID indexée, et 3 autres champs A, B et C indexés.
 
Ma requête est la suivante :  
 
SELECT * FROM MATABLE MA
WHERE MA.A = 'VALEUR'
AND MA.B = 0 OR MA.B = 1
AND ROWNUM < 51
ORDER BY MA.ID
 
Cette requête ne passe pas par l'index défini sur les champs A, B et C mais fait un ACCESS FULL.
 
Si je remplace par  
SELECT * FROM MATABLE MA
WHERE MA.A = 'VALEUR'
AND MA.B IN (0, 1)
AND ROWNUM < 51
ORDER BY MA.ID
 
je passe par l'index...
 
Le problème : je ne peux pas changer la requête ==> pourquoi la 1 ne passe pas par l'index alors que la 2 le fait ?
 
Merci,

Reply

Marsh Posté le 19-11-2009 à 16:05:55   

Reply

Marsh Posté le 19-11-2009 à 20:40:32    

Je n'ai pas testé, mais il me semble que les résultats des 2 requêtes ne sont pas les mêmes.
 
Le AND est prioritaire sur le OR, donc la première fait :
 
WHERE
( MA.A = 'VALEUR' AND MA.B = 0 )
OR
( MA.B = 1 AND ROWNUM < 51 )
 
Si je ne me trompe pas, ça doit expliquer pas mal de choses non ?


Message édité par Mara's dad le 19-11-2009 à 20:40:58

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 20-11-2009 à 08:31:17    

oui c'est exactement ca : le AND est prioritaire sur le OR
de manière analogue le * est prioritaire sur le + dans un calcul algébrique

Reply

Marsh Posté le 20-11-2009 à 09:11:13    

Je confirme, après des tests sur une base ORACLE, les deux requêtes ne sont pas équivalente du tout.
 
Ca serait le cas si la première était en réalité :
SELECT * FROM MATABLE MA
WHERE MA.A = 'VALEUR'
AND ( MA.B = 0 OR MA.B = 1 )
AND ROWNUM < 51
ORDER BY MA.ID  
 
C'est peut être le cas, non ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 20-11-2009 à 10:24:25    

En effet, merci tout le monde, grosse erreur d'inattention...
Avec les parenthèses, on a bien le même plan d'execution...
 
La prochaine fois je me relirai...
 
@+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed