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


相关推荐

  • 一文搞懂│php 中的 DI 依赖注入「建议收藏」

    一文搞懂│php 中的 DI 依赖注入「建议收藏」学好依赖注入,让编程更简单

    2022年8月16日
    4
  • 阅读软件怎么添加书源_认识一波苹果安卓手机上,那些以一敌百的小说漫画软件…[通俗易懂]

    阅读软件怎么添加书源_认识一波苹果安卓手机上,那些以一敌百的小说漫画软件…[通俗易懂]哈喽大家好,我是无知便是罪,专注于收集和分享互联网上有价值的好东西。今天让我们继续分享一些可以自定义源的软件吧。看过我视频的老用户一听到这个词肯定两眼放光了。像我们之前推荐的看小说的阅读,看漫画的异次元和看影视作品的海阔,他们有一个共同的特点,就是允许用户自定义上传一些书源啦漫画源和影视源。这样你在搜索作品的时候呢,软件就会在这些源头里面进行抓取。如果遇到收费的内容呢,你还可以免费换源,…

    2022年6月20日
    40
  • 我用css精灵图拼接了自己的英文名字,不会还有人不知道精灵图技术吧?

    我用css精灵图拼接了自己的英文名字,不会还有人不知道精灵图技术吧?我用css精灵图拼接了自己的英文名字,不会还有人不知道精灵图技术吧?

    2022年5月26日
    39
  • eclipse创建一个java项目目录_Eclipse创建JAVA项目

    eclipse创建一个java项目目录_Eclipse创建JAVA项目项目:project包:package类:class为了便于硬盘上的文件进行管理,通常都会将文件分目录进行存放。同理,在程序开发中,也需要将编写的类在项目中分目录存放,以便于文件管理。为此,Jaca引入了包(package)机制,(貌似跟Python的包差不多),程序可以通过声明包的方式对Java类定义目录。Java中的包是专门用来存放类的,通常功能相同的类存放在相同的包中。在声明包时,使用Pac…

    2022年7月19日
    16
  • bindService:绑定本地服务和远程服务示例

    bindService:绑定本地服务和远程服务示例绑定本地服务AndroidManifest.xml中声明服务:<serviceandroid:name=".TestLocalService"><intent-filter><actionandroid:name="maureen.intent.action.BIND_LOCAL…

    2022年6月7日
    30
  • adb安装使用

    adb安装使用adb工具即AndroidDebugBridge(安卓调试桥)tools。它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互。简单的说就是可以通过电脑端的命令行控制手机或者手机模拟器,例如可以控制手机的点击、滑动、安装应用、打开应用、关闭应用、输入文字等。(只适用于安卓手机)1.电脑端安装abdadb不用安装,下载解压就可以用,下载地址:http://pan.baidu.c…

    2022年5月17日
    66

发表回复

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

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