中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-09 05:26:45 來源:ITPUB博客 閱讀:188 作者:皋高 欄目:關系型數據庫

問題:請教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'
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贞丰县| 潜山县| 邳州市| 开阳县| 玉山县| 孙吴县| 湟中县| 红安县| 尚志市| 寻甸| 东至县| 顺义区| 桓台县| 龙胜| 呼玛县| 金乡县| 工布江达县| 临朐县| 花莲县| 扎兰屯市| 寿宁县| 灵璧县| 庆安县| 喀喇沁旗| 张家港市| 长垣县| 郓城县| 九江县| 土默特左旗| 汾阳市| 文化| 丰都县| 竹溪县| 香港| 泰兴市| 黎城县| 黔西县| 额尔古纳市| 弋阳县| 察隅县| 新宾|