新聞中心
這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
oraclehint中ordered和leading原理很好的帖子
問題:請教HINT寫法
企業(yè)建站必須是能夠以充分展現(xiàn)企業(yè)形象為主要目的,是企業(yè)文化與產(chǎn)品對外擴(kuò)展宣傳的重要窗口,一個(gè)合格的網(wǎng)站不僅僅能為公司帶來巨大的互聯(lián)網(wǎng)上的收集和信息發(fā)布平臺(tái),成都創(chuàng)新互聯(lián)公司面向各種領(lǐng)域:成都資質(zhì)代辦等成都網(wǎng)站設(shè)計(jì)、營銷型網(wǎng)站解決方案、網(wǎng)站設(shè)計(jì)等建站排名服務(wù)。
我有一個(gè)SQL添加如下hint,目的是指定hash_join方式。
select /*+ordered use_hash(a,b,c,d) */ *
From a,b,c,d
Where ...
其中,
a只與b有關(guān)聯(lián)關(guān)系,b只與c有關(guān)聯(lián)關(guān)系,b只與c有關(guān)聯(lián)關(guān)系,c只與d有關(guān)聯(lián)關(guān)系,
數(shù)量級(jí):a:1000條, b:100 萬條, c:800萬條 , d:100萬條
執(zhí)行計(jì)劃為:
Hash Join
---Hash Join
----- Hash Join
------ a
----- b
----- c
---d
考慮到d表比較小,我能不能做到將d表作為驅(qū)動(dòng)表、而a,b,c關(guān)聯(lián)之后的結(jié)果作為prob外表呢,
通過Ordered好像是沒有辦法控制這樣,加了就只能是a作為驅(qū)動(dòng)表裝載內(nèi)存,b作為prob表與之關(guān)聯(lián),
之后的結(jié)果再作為驅(qū)動(dòng)表,以此類推。
用Leading可以嗎?請給出語法,謝謝。
select /*+ordered use_hash(a,b,c,d) */ *
From a,b,c,d
Where ...
其中,
a只與b有關(guān)聯(lián)關(guān)系,b只與c有關(guān)聯(lián)關(guān)系,b只與c有關(guān)聯(lián)關(guān)系,c只與d有關(guān)聯(lián)關(guān)系,
數(shù)量級(jí):a:1000條, b:100 萬條, c:800萬條 , d:100萬條
執(zhí)行計(jì)劃為:
Hash Join
---Hash Join
----- Hash Join
------ a
----- b
----- c
---d
考慮到d表比較小,我能不能做到將d表作為驅(qū)動(dòng)表、而a,b,c關(guān)聯(lián)之后的結(jié)果作為prob外表呢,
通過Ordered好像是沒有辦法控制這樣,加了就只能是a作為驅(qū)動(dòng)表裝載內(nèi)存,b作為prob表與之關(guān)聯(lián),
之后的結(jié)果再作為驅(qū)動(dòng)表,以此類推。
用Leading可以嗎?請給出語法,謝謝。
解答:
oracle
10g中
hash_join可以通過no_swap_join_inputs/swap_join_inputs來強(qiáng)制控制build表,配合leading或者ordered可以控制多表之前的連接順序。
比如t1,t2,t3,t4共4張表做hash_join
可以通過ordered+no_swap_join_inputs/swap_join_inputs來實(shí)現(xiàn)。
比如
如果想實(shí)現(xiàn)
( T3 hash-join (T1 hash-join T2)) hash-join T4
t1作為build表和T2做hash_join,然后t3作為build表和t1,t2的結(jié)果集作hash_join,在把t3,t1,t2的結(jié)果集作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 /
已用時(shí)間: 00: 00: 00.07
執(zhí)行計(jì)劃
----------------------------------------------------------
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
hash_join可以通過no_swap_join_inputs/swap_join_inputs來強(qiáng)制控制build表,配合leading或者ordered可以控制多表之前的連接順序。
比如t1,t2,t3,t4共4張表做hash_join
可以通過ordered+no_swap_join_inputs/swap_join_inputs來實(shí)現(xiàn)。
比如
如果想實(shí)現(xiàn)
( T3 hash-join (T1 hash-join T2)) hash-join T4
t1作為build表和T2做hash_join,然后t3作為build表和t1,t2的結(jié)果集作hash_join,在把t3,t1,t2的結(jié)果集作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 /
已用時(shí)間: 00: 00: 00.07
執(zhí)行計(jì)劃
----------------------------------------------------------
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表示依據(jù)from后面寫的表的順序來做聯(lián)結(jié)~
寫hints,分開些思路清晰~ ordered后 from t1 ,t2 ,t3 ,t4說明首先使用t1做驅(qū)動(dòng)表來連接t2,如何連接呢?看后面的hint use_hash(t2)
代表連接t2的方式是hash_join;然后用use_hash(t3)表示連接t3的方式是hash-join,那么誰作build表呢?看后面的swap_join_inputs(t3)代表t3作build表和t1-t2的結(jié)果集作連接....依此類推~
標(biāo)準(zhǔn)的hint就應(yīng)該這么寫~ use_hash(x,y,z)這樣的寫法是不規(guī)范,這樣只是說出了x,y,z地聯(lián)接方式
寫hints,分開些思路清晰~ ordered后 from t1 ,t2 ,t3 ,t4說明首先使用t1做驅(qū)動(dòng)表來連接t2,如何連接呢?看后面的hint use_hash(t2)
代表連接t2的方式是hash_join;然后用use_hash(t3)表示連接t3的方式是hash-join,那么誰作build表呢?看后面的swap_join_inputs(t3)代表t3作build表和t1-t2的結(jié)果集作連接....依此類推~
標(biāo)準(zhǔn)的hint就應(yīng)該這么寫~ use_hash(x,y,z)這樣的寫法是不規(guī)范,這樣只是說出了x,y,z地聯(lián)接方式
ordered 是陳舊的hints,leading是用來代替ordered的~
leading不要求sql的寫法(from后面的順序不要求),直接可以在leading中定義連接順序~
leading和ordered不能一起使用,也沒必要一起使用~
至于"能不能舉個(gè)Ordered不能實(shí)現(xiàn)而要用Leading的例子",上面已經(jīng)說了,from后面的不能被修改的情況下可以使用leading.用法google一下,一大堆文檔
至于"能不能舉個(gè)Ordered不能實(shí)現(xiàn)而要用Leading的例子",上面已經(jīng)說了,from后面的不能被修改的情況下可以使用leading.用法google一下,一大堆文檔
針對leading使用:
10g中對leading做了加強(qiáng)~
可以直接在后面寫多表的連接順序了,也就是說使用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 /
已用時(shí)間: 00: 00: 00.01
執(zhí)行計(jì)劃
----------------------------------------------------------
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 /
已用時(shí)間: 00: 00: 00.00
執(zhí)行計(jì)劃
----------------------------------------------------------
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 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 /
已用時(shí)間: 00: 00: 00.01
執(zhí)行計(jì)劃
----------------------------------------------------------
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 /
已用時(shí)間: 00: 00: 00.00
執(zhí)行計(jì)劃
----------------------------------------------------------
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'
當(dāng)前文章:oraclehint中ordered和leading原理很好的帖子
文章鏈接:http://ef60e0e.cn/article/giohdc.html