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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 面向对象程序设计的基本原理_面向对象程序设计c++答案

    面向对象程序设计的基本原理_面向对象程序设计c++答案Java程序设计(面向对象)- 设计原理

    2022年4月22日
    32
  • Centos 7 DNS服务器配置

    Centos 7 DNS服务器配置实验三、DNS的管理配置与应用1实验目的(1)了解DNS(域名系统)的工作原理。(2)掌握Linux操作系统中DNS组件安装。(3)掌握Linux操作系统中DNS服务的配置方法。2实验内容(1)在LinuxCentos7.6操作系统中安装DNS组件并配置DNS服务。3实验原理计算机在网络上进行通讯时只能识别如“203.51.0.73”之类的IP地址,而互联网上的网站无穷多,我们很难记住各网站枯燥的IP地址号,这就产生了方便人们记忆的域名管理系统DNS:DomainNam

    2022年6月4日
    37
  • github 收藏_安全小案例分享

    github 收藏_安全小案例分享小案例GitHub地址收藏说明:平时用到的小案例会收藏到此处点击标题直接进入原创者位置并会标明作者js轮播图支持移动端制作人:hishionH5页面唤起APP/移动端网页打开APP作者:ihziluoh…

    2022年4月19日
    51
  • 如何用burpsuite抓包[通俗易懂]

    如何用burpsuite抓包[通俗易懂]首先:使用火狐浏览器,并下载插件proxy点击上图右边的按钮并选择附加组件查询并下载插件配置代理点击options,然后add需要抓包时点击绿色的就行了burpsuite首先我们来到proxy界面在开启插件代理和interceptison的情况下点击某个链接即可抓取数据包需要改包发包的话可以直接在这里修改后直接forward或者同时按ctrl和r在下图…

    2022年5月20日
    64
  • django官方入门教程_DJango

    django官方入门教程_DJangoDjango入门教程Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,模板T和视图V。其最大特点自带一个后台管理系统,可以让只要少量代码就能实现后台管理,尤其适合内容管理网站(如博客,新闻,公司首页等信息类网站),适合中小型web网站。Django基本介绍Django安装HelloDjango开发工具

    2025年10月1日
    3
  • golang 激活码_最新在线免费激活[通俗易懂]

    (golang 激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月26日
    129

发表回复

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

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