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

#sql #performance #oracle #sql-optimization

#sql #Производительность #Oracle #sql-оптимизация

Вопрос:

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

мой запрос

 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)
 

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

Ответ №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
 

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