4 votes

Forcer l'oracle à utiliser un index

Y a-t-il un moyen de forcer Oracle à utiliser un index sans utiliser de hints ?

7voto

Donnie Points 17312

Non. Et si l'optimiseur n'utilise pas l'index, c'est généralement pour une bonne raison. L'utilisation de l'index, si l'index est mauvais, peut en fait ralentir vos requêtes.

7voto

Aaron Digulla Points 143830

Oracle ne utilise pas un index lorsqu'il pense que l'index est

  • désactivé
  • invalide (par exemple, après un chargement massif de données et que les statistiques sur l'index n'ont pas été mises à jour)
  • ne servira à rien (par exemple, lorsqu'il y a seulement deux valeurs différentes dans 5 millions de lignes)

Donc, la première chose à vérifier est que l'index est activé, puis exécutez la commande GATHER correcte sur votre index/table/schema. Lorsque cela ne fonctionne pas, Oracle pense que le chargement de votre index prendra en réalité plus de temps que le chargement des valeurs réelles des lignes. Dans ce cas, ajoutez plus de colonnes à l'index pour le rendre plus "diversifié".

1voto

Philip Schlump Points 1696

Vous pourriez jeter un œil aux contours stockés d'Oracle. Vous pouvez prendre une requête existante et créer un contour stocké et ajuster la requête comme des indications. C'est juste très difficile à utiliser. Faites des recherches avant de décider de mettre en œuvre des contours stockés.

Vous pouvez ajouter des indications dans la requête qui la feront pencher en faveur d'un index plutôt que d'un autre.

En général, si vous avez collecté de bonnes statistiques sur toutes les tables et indexes, Oracle implémente généralement de très bons plans d'exécution.

0voto

Carl Smotricz Points 36400

Si votre requête ne comprend pas le champ indexé dans ses conditions, la base de données serait donc insensée d'utiliser l'index. Ainsi, je rejoins la réponse de Donnie.

0voto

Jeffrey Kemp Points 26050

Oui, techniquement, vous pouvez forcer Oracle à utiliser un index (sans indications), dans un scénario : si la table est une table organisée par index, alors logiquement le seul moyen de interroger la table est via son index car il n'y a pas de table à interroger.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X