2011-09-14 6 views
0

J'ai une requête joignant beaucoup de champs. Pour une raison étrange, l'index d'une table n'est pas du tout utilisé (j'utilise clairement la clé d'index), mais effectue une analyse de table FULL. Je voudrais forcer l'index. Nous avions l'habitude de faire des astuces d'optimiseur dans sybase. Y at-il un indice similaire disponible en oracle? Par exemple, dans sybase pour joindre des tables a, b, c et utiliser myindex dans le tableau a, je le ferais:Forcer un index dans Oracle

SELECT a.* 
FROM  a(INDEX myindex), 
     b, 
     c 
WHERE a.field1 = b.field1 
AND  b.field1 = c.field1 

La question est comment puis-je le fais dans l'oracle. Merci Saro

+1

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements006.htm#SQLRF50405 – NullUserException

+0

Pouvez-vous poster le plan de requête? –

+4

Ce n'est pas une bonne idée d'essayer de déjouer l'optimiseur de requêtes. Une brève explication: http://stackoverflow.com/questions/7358137/oracle-full-text-search-with-condition/7379753#7379753 – NullUserException

Répondre

4

Oui, il y a un indice comme ça dans Oracle. Il ressemble à ceci:

select /*+ index(a my_index) */ from a 
+0

Vous avez besoin de la tablepec (voir les [docs] (http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/sql_elements006.htm#SQLRF50405)); le nom de l'index est facultatif si vous voulez suggérer qu'Oracle utilise un index mais ne souhaite pas spécifier lequel. Cela devrait donc être 'INDEX (un my_index)'. Et si la table a un alias dans la requête, vous devez utiliser l'alias comme tablepec. –

+0

Merci. Donc, vous dites que je devrais faire quelque chose comme ceci: SELECT/* + index (un my_index) * /, un * FROM un (INDEX myindex), \t \t b, c \t \t OÙ a.field1 = b. .field1 ET b.field1 = c.field1 –

+1

@Saro - non: 'SELECT/* + index (a mon_index) */a. * FROM a, b, c O WH a.field1 = b.field1 ET b.field1 = c.field1'. (De préférence avec des jointures ANSI, mais c'est un autre sujet ...) –

Questions connexes