千家信息网

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

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,问题:请教HINT写法我有一个SQL添加如下hint,目的是指定hash_join方式。select /*+ordered use_hash(a,b,c,d) */ *From a,b,c,dWher
千家信息网最后更新 2026年10月31日oracle hint中ordered 和leading原理很好的帖子

问题:请教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

执行计划
----------------------------------------------------------
Plan hash value: 3494725078

-------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
-------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2137 | 801K| | 182 (2)| 00:00:03 |
|* 1 | HASH JOIN | | 2137 | 801K| | 182 (2)| 00:00:03 |
|* 2 | HASH JOIN | | 52 | 14976 | | 167 (2)| 00:00:03 |
|* 3 | TABLE ACCESS FULL | T3 | 40 | 3840 | | 15 (0)| 00:00:01 |
|* 4 | HASH JOIN | | 11651 | 2184K| 1232K| 151 (1)| 00:00:02 |
| 5 | TABLE ACCESS FULL| T1 | 11651 | 1092K| | 15 (0)| 00:00:01 |
| 6 | TABLE ACCESS FULL| T2 | 11652 | 1092K| | 15 (0)| 00:00:01 |
|* 7 | TABLE ACCESS FULL | T4 | 41 | 3936 | | 15 (0)| 00:00:01 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - access("T3"."OWNER"="T4"."OWNER")
2 - access("T2"."OBJECT_NAME"="T3"."OBJECT_NAME")
3 - filter("T3"."OWNER"='MYDB')
4 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
7 - filter("T4"."OWNER"='MYDB')

Note
-----
- dynamic sampling used for this statement
说明: ordered表示依据from后面写的表的顺序来做联结~
写hints,分开些思路清晰~ ordered后 from t1 ,t2 ,t3 ,t4说明首先使用t1做驱动表来连接t2,如何连接呢?看后面的hint use_hash(t2)
代表连接t2的方式是hash_join;然后用use_hash(t3)表示连接t3的方式是hash-join,那么谁作build表呢?看后面的swap_join_inputs(t3)代表t3作build表和t1-t2的结果集作连接....依此类推~

标准的hint就应该这么写~ use_hash(x,y,z)这样的写法是不规范,这样只是说出了x,y,z地联接方式
ordered 是陈旧的hints,leading是用来代替ordered的~ leading不要求sql的写法(from后面的顺序不要求),直接可以在leading中定义连接顺序~ leading和ordered不能一起使用,也没必要一起使用~
至于"能不能举个Ordered不能实现而要用Leading的例子",上面已经说了,from后面的不能被修改的情况下可以使用leading.用法google一下,一大堆文档 针对leading使用: 10g中对leading做了加强~ 可以直接在后面写多表的连接顺序了,也就是说使用leading不需要from后面的固定顺序了
MYDB@MYDB10G >select
2 /*+
3 leading(t1 t2 t3 t4)
4 use_hash(t2)
5 use_hash(t3)
6 swap_join_inputs(t3)
7 use_hash(t4)
8 no_swap_join_inputs(t4)
9 */ * from t3,t4,t2,t1
10 where t1.object_id=t2.object_id
11 and t2.object_name=t3.object_name
12 and t3.owner=t4.owner
13 and t4.owner='MYDB'
14 /
已用时间: 00: 00: 00.01

执行计划
----------------------------------------------------------
Plan hash value: 3494725078

-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2069 | 179K| 57 (4)| 00:00:01 |
|* 1 | HASH JOIN | | 2069 | 179K| 57 (4)| 00:00:01 |
|* 2 | HASH JOIN | | 50 | 3100 | 38 (3)| 00:00:01 |
|* 3 | TABLE ACCESS FULL | T3 | 40 | 1080 | 18 (0)| 00:00:01 |
|* 4 | HASH JOIN | | 82 | 2870 | 20 (5)| 00:00:01 |
| 5 | TABLE ACCESS FULL| T1 | 11584 | 248K| 16 (0)| 00:00:01 |
| 6 | TABLE ACCESS FULL| T2 | 82 | 1066 | 3 (0)| 00:00:01 |
|* 7 | TABLE ACCESS FULL | T4 | 41 | 1107 | 18 (0)| 00:00:01 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - access("T3"."OWNER"="T4"."OWNER")
2 - access("T2"."OBJECT_NAME"="T3"."OBJECT_NAME")
3 - filter("T3"."OWNER"='MYDB')
4 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
7 - filter("T4"."OWNER"='MYDB')

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 */ * from t1,t2,t3,t4
10 where t1.object_id=t2.object_id
11 and t2.object_name=t3.object_name
12 and t3.owner=t4.owner
13 and t4.owner='MYDB'
14 /
已用时间: 00: 00: 00.00

执行计划
----------------------------------------------------------
Plan hash value: 3494725078

-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2069 | 179K| 57 (4)| 00:00:01 |
|* 1 | HASH JOIN | | 2069 | 179K| 57 (4)| 00:00:01 |
|* 2 | HASH JOIN | | 50 | 3100 | 38 (3)| 00:00:01 |
|* 3 | TABLE ACCESS FULL | T3 | 40 | 1080 | 18 (0)| 00:00:01 |
|* 4 | HASH JOIN | | 82 | 2870 | 20 (5)| 00:00:01 |
| 5 | TABLE ACCESS FULL| T1 | 11584 | 248K| 16 (0)| 00:00:01 |
| 6 | TABLE ACCESS FULL| T2 | 82 | 1066 | 3 (0)| 00:00:01 |
|* 7 | TABLE ACCESS FULL | T4 | 41 | 1107 | 18 (0)| 00:00:01 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - access("T3"."OWNER"="T4"."OWNER")
2 - access("T2"."OBJECT_NAME"="T3"."OBJECT_NAME")
3 - filter("T3"."OWNER"='MYDB')
4 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
7 - filter("T4"."OWNER"='MYDB'
顺序 关联 结果 方式 驱动 万条 写法 控制 代表 可以通过 陈旧 必要 以此类推 依此类推 也就是 也就是说 例子 内存 办法 只是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 百单网互联网科技有限公司怎么样 博彦科技互联网金融 上海睿民互联网科技有限公司 互联网佳科技有限公司 互联网是不是新科技 互联网科技集团 万易互联网科技有限公司 有木互联网科技 互联网科技生活的内容 岳阳华臻互联网科技有限公司 江阴互联网智能科技产品进口 注册互联网科技公司经营范围大全 国大互联网教育科技有限公司工作 乌鲁木齐新华智原互联网科技学校 互联网科技如何创业 互联网科技实习生岗位 珠海东科互联网科技有限公司 北京天晋互联网科技有限公司 互联网科技的前景 优雇互联网科技有限公司 互联网科技公司简介 西安纸贵互联网科技有限公司 科技创新与互联网经济 互联网科技垄断 互联网科技小额贷款 互联网科技大奖都有哪些公司 江苏互联网科技小贷 第三届互联网大会安防黑科技 盐城市攀科互联网科技有限公司 互联网大会出现的黑科技
0