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

oracle hint中ordered 和leading原理很好的帖子问题 请教 HINT 写法我有一个 SQL 添加如下 hint 目的是指定 hash join 方式 select ordereduse hash a b c d Froma b c dWhere 其中 nbsp nbsp nbsp nbsp a 只与 b 有关联关系 b 只与 c 有关联关系 b 只与 c 有关联关系 c 只与 d 有关联关系 nbsp nbsp 数量级 a 1000 条 nbsp nbsp b 100

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

————————————————————————————-
| 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:

—————————————————————————–
| 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:

—————————————————————————–
| 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’)























































































版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233621.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 1190. 反转每对括号间的子串(栈|splay)[通俗易懂]

    1190. 反转每对括号间的子串(栈|splay)[通俗易懂]给出一个字符串 s(仅含有小写英文字母和括号)。请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。注意,您的结果中 不应 包含任何括号。示例 1:输入:s = “(abcd)”输出:”dcba”示例 2:输入:s = “(u(love)i)”输出:”iloveu”示例 3:输入:s = “(ed(et(oc))el)”输出:”leetcode”示例 4:输入:s = “a(bcdefghijkl(mno)p)q”输出:”apmnolkjihgf

    2022年8月11日
    4
  • 取反是什么意思_1取反是多少

    取反是什么意思_1取反是多少很多编程语言使用~作为一元按位取反(NOT)操作符,Go重用^XOR操作符来按位取反://错误的取反操作funcmain(){fmt.Println(~2)//bitwisecomplementoperatoris^}//正确示例funcmain(){varduint8=2fmt.Printf(“%08b\n”,d)//00000010fmt.Printf(“%08b\n”

    2022年8月14日
    9
  • 部门年终会议如何开_关于召开年度工作总结会议的通知

    部门年终会议如何开_关于召开年度工作总结会议的通知前言:最近有同学问我,部门年终总结会议要不要开,是否有这个必要?那我就说说我的观点,关注我的同学都知道我上月初刚参加完团队的年终总结,我想我应该很有发言权!部门年终总结会议有必要开吗?一、这是否有你的心理?二、那到底要不要开?三、个人感慨!一、这是否有你的心理?每年的年终,不仅个人要写年终总结,团队的leader也要复盘团队一年的工作情况以及来年的展望。很多人都会认为这个无非就是走个形式,给上面的领导看,基本没有任何意义,大家就无非聚集在一起,开个无聊的会,讲完后大家屁股一抬,工作的事全部重来!二

    2022年9月25日
    1
  • 【NOIP2012提高组】借教室[通俗易懂]

    【NOIP2012提高组】借教室[通俗易懂]题目背景NOIP2012 提高组 DAY2 试题。题目描述在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。面对海量租借教室的信息,我们自然希望编程解决这个问题。我们需要处理接下来 n 天的借教室信息,其中第 i 天学校有 ri 个教室可供租借。共有 m 份订单,每份订单用三个…

    2022年8月22日
    5
  • 一文读懂自监督学习

    一文读懂自监督学习公众号关注“视学算法”设为“星标”,DLCV消息即可送达!来自|知乎作者丨Sherlock来源丨https://zhuanlan.zhihu.c…

    2022年9月14日
    3
  • mac pycharm打不开问题[通俗易懂]

    mac pycharm打不开问题[通俗易懂]1.cd/Applications/PyCharm.app/Contents/MacOS2../pycharm1/2步骤可查看具体错误一般解决方法:1.cd/Users/iss/Library/Preferences/PyCharm2019.1/2.rm-fpycharm.vmoptions转载于:https://www.cnblogs.com/Feng…

    2022年8月27日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号