Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2143 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Oracle] Gestion des index

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Oracle] Gestion des index

n°1942390
Tibar
Posté le 19-11-2009 à 16:05:55  profilanswer
 

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,

mood
Publicité
Posté le 19-11-2009 à 16:05:55  profilanswer
 

n°1942552
Mara's dad
Yes I can !
Posté le 19-11-2009 à 20:40:32  profilanswer
 

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é.
n°1942637
couak
Posté le 20-11-2009 à 08:31:17  profilanswer
 

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

n°1942656
Mara's dad
Yes I can !
Posté le 20-11-2009 à 09:11:13  profilanswer
 

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é.
n°1942700
Tibar
Posté le 20-11-2009 à 10:24:25  profilanswer
 

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...
 
@+


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Oracle] Gestion des index

 

Sujets relatifs
Trigger : OracleRegex match last index
probléme avec ma page d'index[xsl]gestion du retour chariot dans une variable string
Index supprimé toujours en ligne[Oracle 9.2] Comment réorganiser mes Datafiles ?
z index ne marche pas overlay toujours en arrière planExclure des résultats sql oracle
gestion des erreurs dans un code wordGestion d'erreurs php - comment tout cacher ?
Plus de sujets relatifs à : [Oracle] Gestion des index


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR