2013-06-17 17 views
8

Mam wymóg, w którym muszę wymusić sql nie używać konkretnego indeksu, który istnieje na stole.Jak wymusić wyrocznia, aby nie używać indeksu

np

create table t1(id varhcar2(10),data1 varchar2(3000)); 
create table t2(id varhcar2(10),data2 varchar2(3000)); 

create index id1 on t1(id); 

select * from t1,t2 where t1.id=t2.id; 

nie mogę upuścić ID1 indeksu ani upuszczać go, jak ja nie mają prawa na nim. w związku z tym chcę dodać podpowiedź, aby go uniknąć ..

Czy istnieje taka podpowiedź, czy jest jakiś sposób obejścia tego problemu.

góry dzięki

Odpowiedz

2

Istnieje ogólna zasada, że ​​dla każdego zapytania, dla którego chcesz określić plan wykonania, potrzebujesz czegoś takiego jak dwie lub trzy podpowiedzi na stół.

W tym przypadku, jesteś prawdopodobnie szuka łączyć mieszania wynikające z dwóch pełnych skanów stół, który jest dość prosta więc blok wskazówka byłoby coś takiego:

select /*+ full(t1) full(t2) use_hash(t1 t2) */ 
... 
2

można zapobiec wykorzystywaniu indeks na kolumnie bez podpowiedzi przez zastosowanie do niej funkcji. Będziesz chciał użyć funkcji "no-op", aby wartości kolumn nie zostały zmienione. W przypadku liczb może to być zero, w przypadku ciągów dołączających pusty łańcuch:

select * from t1,t2 where t1.id || '' =t2.id;

Powiązane problemy