Bonjour a tous,
(oracle 10G -- Linux 5)
petit casse tête de vendredi, j'ai cette requête:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 SELECT P.ID, P.ES, FN.GR, P.PVP FROM PROD P INNER JOIN FAM FN ON FN.GEN=P.GEN WHERE P.ID NOT LIKE '00%' AND decode(P.ID,'06570074','770', decode(P.ID,'73268025','229', decode(P.ID,'63210660','208', decode(P.ID,'61154352','150', decode(P.ID,'06553572','753', decode(P.ID,'06563389','763', DECODE(substr(P.ID,3,1), '9', P.FAM||SUBSTR(P.ID,4,2), '8', P.FAM||SUBSTR(P.ID,4,2), '7', P.FAM||SUBSTR(P.ID,4,2), SUBSTR(P.ID,3,3) ) ) ) ) ) ) ) = FN.ID AND P.ID NOT IN('53006262','53328461','53328462');
Telle que vous la voyez, cette requête génère un full scan sur la table PROD, bien que cette table possède une PK sur le champs ID.
Si vous changez le NOT IN de la fin par un IN, la PK est prise en compte et de 60 000 GETS ça passe a 8... Le résultat n'est plus le même bien sur, et je voudrais savoir s'il existe un moyen d'utiliser la PK avec le NOT IN.
quelqu'un a une idée?
Moi je sèche, j'ai pensé a un index INVERSE, mais comme la tabla est utilisée pour d'autres traitements si j'inverse l'index, j'ai peur que cela dégrade d'autres requêtes.
D'avance merci pour toute suggestion.
Partager