oracle leading(),oracle hint中ordered 和leading原理很好的帖子

本文介绍了如何在Oracle 10g中通过使用HINTs如`ordered`, `use_hash`, `swap_join_inputs`和`no_swap_join_inputs`来控制SQL查询的连接顺序和哈希连接的build表,以优化查询性能。在给定的例子中,详细解释了如何使小表d作为驱动表,而a, b, c关联后的结果作为prob表进行连接,以提高查询效率。
摘要由CSDN通过智能技术生成

问题:请教HINT写法

我有一个SQL添加如下hint,目的是指定hash_join方式。

select /*+ordered use_hash(a,b,c,d) */ *

from a,b,c,d

Where ...

其中,

a只与b有关联关系,b只与c有关联关系,b只与c有关联关系,c只与d有关联关系,

数量级:a:1000条,  b:100 万条, c:800万条 , d:100万条

执行计划为:

Hash Join

---Hash Join

-----  Hash Join

------  a

-----    b

-----  c

---d

考虑到d表比较小,我能不能做到将d表作为驱动表、而a,b,c关联之后的结果作为prob外表呢,

通过Ordered好像是没有办法控制这样,加了就只能是a作为驱动表装载内存,b作为prob表与之关联,

之后的结果再作为驱动表,以此类推。

用Leading可以吗?请给出语法,谢谢。

解答:

oracle 10g中

hash_join可以通过no_swap_join_inputs/swap_join_inputs来强制控制build表,配合leading或者ordered可以控制多表之前的连接顺序。

比如t1,t2,t3,t4共4张表做hash_join

可以通过ordered+no_swap_join_inputs/swap_join_inputs来实现。

比如

如果想实现

( T3 hash-join (T1 hash-join T2)) hash-join T4

t1作为build表和T2做hash_join,然后t3作为build表和t1,t2的结果集作hash_join,在把t3,t1,t2的结果集作build表和t4做hash_join

通过sql可以写为

MYDB@MYDB10G >select

2  /*+

3  ordered

4  use_hash(t2)

5  use_hash(t3)

6  swap_join_inputs(t3)

7  use_hash(t4)

8  no_swap_join_inputs(t4)

9  */

10  * from t1,t2,t3,t4

11  where t1.object_id=t2.object_id

12  and t2.object_name=t3.object_name

13  and t3.owner=t4.owner

14  and t4.owner='MYDB'

15  /

已用时间:  00: 00: 00.07

执行计划

------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值