3

クエリにヒントを適用しようとしていますが、説明プランが使用されているヒントに変更されません。

私の質問

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)

ご覧のとおり、ネストされたループの代わりにハッシュ結合を使用するようにクラスターに強制しています。しかし、説明計画は、ネストされたループを使用していることを示しています。

4

1 に答える 1

7

一般に、ヒントを使用している場合は、テーブル名ではなくエイリアスを参照する必要があります。また、USE_HASH には 2 つのテーブル名が必要です。したがって、次のようなものが必要です

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

もちろん、クエリをヒントする必要がある場合は、通常、統計が正しくないことを意味します。また、一般的には、オプティマイザーがより効率的な計画を独自に選択できるように、統計に問題がある場合は修正した方がよいでしょう。

于 2011-10-26T22:10:17.583 に答える