Oracle de ne pas utiliser d'index lors de l'adhésion
Je suis très nouveau à l'indice et d'expliquer plans, de sorte s'il vous plaît garder avec moi!
Je suis en train de paramétrer une requête, mais je suis d'avoir des problèmes.
J'ai deux tables:
SKU
------
SKUIDX (Unique index)
CLRIDX (Index)
..
..
IMPCOST_CLR
-----------
ICCIDX (Unique index)
CLRIDX (Index)
...
..
Quand je fais un select * from SKU where clridx = 122
, je peux voir que c'est à l'aide de l'index dans le plan d'expliquer (il dit d'ACCÈS à la TABLE.. INDICE, il est dit que le nom de l'index sous OBJECT_NAME et les options d'exploration.
Maintenant, quand j'essaie de joindre sur le même champ, il ne semble pas utiliser l'index (il dit d'ACCÈS à la TABLE.. JOINTURE de HACHAGE et sous options, il dit PLEIN).
Que dois-je être à la recherche pour l'essayer et de voir pourquoi il n'est pas à l'aide de l'index?
Désolé, je ne suis pas sûr de ce que les commandes à taper pour afficher ce donc, s'il vous plaît laissez-moi savoir si vous avez besoin de plus d'informations.
Exemples:
1ère requête:
SELECT
*
FROM
AP21.SKU
WHERE
CLRIDX = 100
2ème requête:
SELECT
*
FROM
AP21.IMPCOST_CLR
WHERE
CLRIDX = 100
3ème requête:
SELECT
*
FROM
AP21.SKU
INNER JOIN
AP21.IMPCOST_CLR ON
IMPCOST_CLR.CLRIDX = SKU.CLRIDX
Hi - voir mon edit. La requête im essayant de tune est des centaines de beaucoup plus de temps, mais en le décomposant et en la prenant étape par étape!
Comment avez-vous résolu votre analyse complète du problème?
par la compréhension juste de la façon dont SQL et requêtes : -) Voir la réponse ci-dessous
OriginalL'auteur Lock | 2013-07-16
Vous devez vous connecter pour publier un commentaire.
Regarder cette requête:
Il n'a pas d'supplémentaire des prédicats. Si vous vous joignez à toutes les lignes dans le SKU de toutes les lignes dans IMPCOST_CLR. En outre, vous sélectionnez toutes les colonnes des deux tables.
Cela signifie Oracle a qu'à lire l'intégralité des tables. Le moyen le plus efficace de le faire est d'utiliser le Tableau d'Analyse, de ramasser toutes les lignes de multi-bloc lit, et utiliser le hachage pour correspondre aux valeurs de la rejoindre.
Fondamentalement, c'est une opération de l'ensemble, qui est ce que SQL est très bien, tandis que indexés les lectures sont plus RBAR. Maintenant, si vous avez modifié la troisième requête pour inclure un prédicat supplémentaire, comme
vous seraient le plus susceptibles de voir le chemin d'accès revenir à l'INDEX RANGE SCAN . Parce que vous êtes seulement de la sélection d'un comparatif poignée de lignes, de sorte que le indexé lire est le plus efficace une fois de plus.
C'est une bonne technique, mais vous avez besoin de comprendre comment l'Oracle optimzer œuvres. Il y a beaucoup d'informations à Expliquer le Plan. En savoir plus. Prêter attention à la valeur de la
Rows
colonne pour chaque étape. Que vous indique le nombre de lignes de l'Optimiseur s'attend à obtenir de l'opération. Vous verrez des valeurs très différentes pour les deux premières requêtes par rapport à la troisième.dans ce cas, l'intégralité de la Table d'Analyse est le moyen le plus efficace pour accéder aux données. Alors, pourquoi voudriez-vous l'éviter?
OriginalL'auteur APC
C'est parce que la JOINTURE de HACHAGE n'utilise pas (besoin) d'index sur les prédicats de jointure:
http://use-the-index-luke.com/sql/join/hash-join-partial-objects
OriginalL'auteur Markus Winand