Bonjour,
je sais que la question a été posée des millions de fois mais quand même là c'est un peu gros:
j'ai une table de 10 millions de lignes environ, avec une cinquantaine de colonnes.
La colonne colonne1 est un VARCHAR2(100) avec un index directement dessus.
Je fais un
l'index est bien utilisé (vérifié via explain plan), j'ai mes 27 lignes de résultat en 150 ms environ
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT * FROM matable WHERE colonne1 = 'Ma Valeur'
Maintenant je tente un truc de fou:
Et là c'est le drame: je retombe en full table scan, je récupère mes 27 lignes triées en 1 minutes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT * FROM matable WHERE colonne1 = 'Ma Valeur' order by colonne2
En utilisant un hint:
, je retrouve mes 150 ms
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT /*+ index(matable monindex) */ * FROM matable WHERE colonne1 = 'Ma Valeur' order by colonne2
Sauf qu'inclure un hint dans mon application ne m'arrange pas vraiment.
Comment un simple order by peut-il changer le plan d'exécution à ce point? Au pire je ferai le tri dans mon appli mais c'est quand même dommage...
Détails techniques:
- Oracle 10G
- la table et l'index ont été analysés juste avant la requête
- il y a un index sur colonne2, qui ne semble pas être utilisé pour ces 3 requêtes...
Quelqu'un a une idée?
Partager