oracle hint中ordered 和leading原理很好的帖子
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,问题:请教HINT写法我有一个SQL添加如下hint,目的是指定hash_join方式。select /*+ordered use_hash(a,b,c,d) */ *From a,b,c,dWher
千家信息网最后更新 2025年02月01日oracle hint中ordered 和leading原理很好的帖子
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'
问题:请教HINT写法
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安全错误
数据库的锁怎样保障安全
面试时被问软件开发规划
服务器管理linux版本
三种数据库的比较
广西数据软件开发设施参考价格
杭州大数据软件开发费用
临海销售软件开发信息推荐
网络安全和软件开发学哪个
物流系统数据库的设计
国外文献数据库收费
如何给数据库中学生表设主键
用数据库查询1986年出生的人
动态数据库和专题数据库
微信扫一扫数据库程序
辅助管理服务器访问端口软件
扫描到文件服务器什么意思
四川iptv服务器费用
软件开发核算方法有哪些问题
路由器设置不了服务器
崇明区网络营销软件开发价格表格
免费 smtp服务器
杨浦区个性化软件开发诚信服务
河南炽梦网络技术有限公司
redis订阅 删除数据库
网络安全自我提升
极速传奇软件开发官网
河北安卓软件开发怎么样
网络安全事件研判
网络安全预案公安
免费 smtp服务器
郑州蜜房网络技术有限公司