Comment puis-je choisir des notes différentes pour jointures différentes pour une seule table dans un indicateur de requête?

StackOverflow https://stackoverflow.com/questions/2524248

Question

Supposons que j'ai la requête suivante:

select * from A, B, C, D
where A.x = B.x
and B.y = C.y
and A.z = D.z

Je index sur A.x et B.x et B.y et C.y et D.z

Il n'y a pas d'index A.z.

Comment puis-je donner un indice à cette question d'utiliser un indicateur d'index sur A.x mais un soupçon de USE_HASH sur A.z? Il semble que des notes ne prennent le nom de la table, pas spécifique rejoindre, donc lors de l'utilisation d'une table unique avec plusieurs je ne rejoint peut spécifier une seule stratégie pour tous.

Alternative, je suppose que je utilise une avance ou indice sur la requête ORDONNE ci-dessus. Ces deux indices prennent seulement un nom de table, donc comment puis-je faire en sorte que la A.x = B.x joindre a lieu avant celui A.z = D.z? Je me rends compte dans ce cas, je pourrais énumérer D d'abord, mais imaginez D se joint ensuite à E et que le D-E se joindre est le dernier que je veux dans toute la requête.

Une troisième configuration - Supposons que je veux que le A.x se joindre à la première de toute requête, et je veux le rejoindre A.z être le dernier. Comment puis-je utiliser un soupçon d'avoir une seule jointure de A à avoir lieu, suivi du B-C rejoindre, et A-D Assemblez durer?

Était-ce utile?

La solution

Tout d'abord, l'utilisation de ces conseils devrait être le dernier recours, pas une façon normale de requêtes d'écriture. La plupart du temps, vous devez simplement faire en sorte que les statistiques sont Optimiseur à jour et laisser le CBO le chemin optimal pour lui-même - c'est son travail

L'indicateur INDEX peut indiquer le nom de l'index que vous souhaitez utiliser comme ceci:

SELECT /*+ INDEX (A, A_X_IDX) */ *
...

(en supposant que l'indice de A.X est appelé A_X_IDX).

Vous ne pouvez pas dire utiliser Oracle utiliser l'index sur A.X et utiliser une jointure de hachage à la table A dans la même déclaration, qui n'a aucun sens. Cependant, vous pouvez (si vous devez) spécifier le chemin d'accès pour chaque chose comme la table:

SELECT /*+ INDEX (A, A_X_IDX) INDEX(B, B_Y_IDX) USE_HASH(C) */ *

Mais je le répète, il devrait être rare besoin de le faire . Oracle ont investi des millions de dollars dans le développement et l'heures-homme CBO, alors pourquoi changer efficacement au large?

Autres conseils

Sur SQL Server, vous feriez un indice commun hachage comme ceci

SELECT * FROM table1 t1
INNER hash join table2 t2 ON  t1.id = t2.id

et vous pouvez également fournir un indicateur d'index

select * from table1 t1
inner  join table2 t2 with (index( bla))  on  t1.id = t2.id

Je ne sais pas ce que la syntaxe ressemble à Oracle, BTW pourquoi vous utilisez le style ancien rejoint? Êtes-vous toujours sur 8i?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top