hints ordered leading use_nl

1:ordered  
就是表示根据 from 后面表的顺序join,从左到右,左边的表做驱动表。 连接方式是 HASH JOIN
2:use_nl()
use_nl(t1) 如果只带了一个表名作为参数,则该表为被驱动表, 连接方式是    HASH JOIN
use_nl(t1,t2) 表示对表t1、t2关联时采用嵌套循环连接     NESTED LOOPS
但是并不能让优化器确定谁是驱动表或谁是被驱动的表
3:leading()
leading(t1) 指定t1为驱动表               连接方式是 HASH JOIN

单独使用
select /*+ ordered*/* from t1,t2 where t1.a=t.a;
ordered制定了t1为驱动表     连接方式  HASH JOIN

select /*+   use_nl(t1,t2)*/* from t1,t2 where t1.a=t.a;
use_ul(t1,t2)指定了这2个表 连接方式为     NESTED LOOPS
搭配使用:
select /*+ ordered  use_nl(t1,t2)*/* from t1,t2 where t1.a=t.a;
ordered  指定了t1为驱动表,use_ul(t1,t2)指定了2各表 连接方式为     NESTED LOOPS

select /*+ ordered  use_nl(t2)*/* from t1,t2 where t1.a=t.a;
ordered  指定了t1为驱动表,use_ul(t2)指定了t2为被驱动表(没有冲突)
表连接方式为      NESTED LOOPS

select /*+ ordered  use_nl(t1)*/* from t1,t2 where t1.a=t.a;
ordered  指定了t1为驱动表,use_ul(t1)指定了t1为被驱动表(有冲突)
所以oracle 忽视这个hint,    表连接方式为     HASH JOIN


select /*+ leading(t1)  use_nl(t2)*/* from t1,t2 where t1.a=t.a;
leading(t1)  指定了t1为驱动表,use_ul(t2)指定了t2为被驱动表(没有冲突)
连接方式为      NESTED LOOPS

select /*+ leading(t1) use_nl(t1)*/* from t1,t2 where t1.a=t.a;
leading(t1)指定了t1为驱动表,use_ul(t1)指定了t1为被驱动表(有冲突)
所以oracle 忽视这个hint,    表连接方式为     HASH JOIN

1./*+use_nl(t2,t) */ 提示走nest loop,但没有提示t2还是t为驱动表 。
2./*+ ordered use_nl(t2,t) */提示走nest loop,order提示的是from后面的第一个表为驱动表。
3./*+ leading(t2) use_nl(t) */ 直接提示t2为驱动表。
结论:use_nl不能让优化器确定谁是驱动表谁是被驱动的表,use_nl(t,t2)也没有指出哪个是驱动表,这时候我们需要使用ordered,leading来强制指定驱动表,以达到我们的目的。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值