【问题标题】:Using hints in oracle在 oracle 中使用提示
【发布时间】:2011-10-26 21:56:52
【问题描述】:

我正在尝试对我的查询应用提示,但解释计划并未更改为正在使用的提示。

我的查询

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)

如您所见,我正在强制集群使用散列连接而不是嵌套循环。但是解释计划仍然显示它正在使用嵌套循环。

【问题讨论】:

    标签: sql performance oracle sql-optimization


    【解决方案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
    

    当然,如果您发现自己需要提示查询,这通常意味着您的统计信息不正确。而且,您通常最好解决统计数据存在的任何问题,以便优化器自行选择更有效的计划。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 2021-06-22
      • 1970-01-01
      相关资源
      最近更新 更多