Oracle
 sql >> Base de données >  >> RDS >> Oracle

Pourquoi l'index n'est-il pas utilisé pour cette requête ?

MISE À JOUR : Essayez de rendre la colonne col NOT NULL. C'est la raison pour laquelle il n'utilise pas l'index. Quand ce n'est pas nul, voici le plan.

SELECT STATEMENT, GOAL = ALL_ROWS           69  10  30
                    HASH GROUP BY           69  10  30
 INDEX FAST FULL SCAN   SANDBOX TEST_INDEX  56  98072   294216

Si l'optimiseur détermine qu'il est plus efficace de NE PAS utiliser l'index (peut-être en raison de la réécriture de la requête), il ne le fera pas. Les conseils de l'optimiseur ne sont que cela, à savoir des conseils pour indiquer à Oracle un index que vous aimeriez à utiliser. Vous pouvez les considérer comme des suggestions. Mais si l'optimiseur détermine qu'il est préférable de ne pas utiliser l'index (encore une fois, à la suite d'une réécriture de requête par exemple), alors il ne le fera pas.

Reportez-vous à ce lien :http://download. oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm "La spécification de l'un de ces conseils oblige l'optimiseur à choisir le chemin d'accès spécifié uniquement si le chemin d'accès est disponible en fonction de l'existence d'un index ou d'un cluster et des constructions syntaxiques de l'instruction SQL. Si un conseil spécifie un chemin d'accès indisponible, alors l'optimiseur l'ignore."

Étant donné que vous exécutez une opération count(*), l'optimiseur a déterminé qu'il est plus efficace d'analyser simplement l'intégralité de la table et du hachage au lieu d'utiliser votre index.

Voici un autre lien pratique sur les astuces :http://www.dba-oracle.com/t_hint_ignored. htm