Использование подсказок в оракуле

Я пытаюсь применить подсказки к моему запросу, но план объяснения не меняется на используемую подсказку.

мой запрос

select/*+ USE_HASH(master_flight)*/ bid, b.fno, seat, flight_date from
master_booking b, master_flight f where b.fno = f.fno and rownum <
120000

объяснить план

119999 COUNT STOPKEY (cr=11336 pr=446 pw=0 time=240292 us)
119999 NESTED LOOPS (cr=11336 pr=446 pw=0 time=120236 us)
800 TABLE ACCESS FULL ASS2MASTER_FLIGHT (cr=936 pr=441 pw=0 time=22455 us)
119999 TABLE ACCESS CLUSTER ASS2MASTER_BOOKING (cr=10400 pr=5 pw=0 time=6858 us)
800 INDEX UNIQUE SCAN FNO_INDEX (cr=1600 pr=5 pw=0 time=4717 us)(object id 332468)

как видите, я заставляю кластер использовать хеш-соединение вместо вложенного цикла. но план объяснения по-прежнему показывает, что он использует вложенный цикл.


person paktrick    schedule 26.10.2011    source источник


Ответы (1)


В общем, если вы используете подсказку, вам нужно ссылаться на псевдонимы, а не на имя таблицы. И USE_HASH требует двух имен таблиц. Итак, вам нужно что-то вроде

SELECT /*+ use_hash(b f) */ 
       bid, b.fno, seat, flight_date
  FROM master_booking b,
       master_flight  f
 WHERE b.fno = f.fno
   AND rownum < 120000

Конечно, если вам нужно намекнуть на запрос, это обычно означает, что ваша статистика неверна. И, как правило, лучше исправить любую проблему со статистикой, чтобы оптимизатор самостоятельно выбрал более эффективный план.

person Justin Cave    schedule 26.10.2011