Gestion des index [Oracle] - SQL/NoSQL - Programmation
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 ?
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
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 ?
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...
@+
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,