目录

一、简介

二、 SORT MERGE JOIN(排序-合并连接)

三、NESTED LOOPS(嵌套循环)

四、HASH JOIN(哈希连接)

五、CARTESIAN PRODUCT(笛卡尔积)

六、参考资料


一、简介

Oracle中主要有下面四种表连接方式:

  1. SORT MERGE JOIN(排序-合并连接);
  2. NESTED LOOPS(嵌套循环);
  3. HASH JOIN(哈希连接);
  4. CARTESIAN PRODUCT(笛卡尔积);

Oracle中,通过JOIN关键字进行表连接操作,一次只能连接两张表,JOIN 操作的各步骤一般是串行的(在读取做连接的两张表的数据时可以并行读取)。

需要说明两个重要的概念:驱动表与匹配表。注意这些概念只存在于NESTED LOOPS(嵌套循环)与 HASH JOIN(哈希连接)两种表连接方式中。

  • 驱动表(Driving Table):

表连接时首先存取的表,又称外层表(Outer Table),可以简单理解为查询的主表;

注意:如果驱动表返回的数据行数过多,必须会影响查询效率,所以我们一般选择小表(查询结果返回较少行数的表) 作为驱动表。

  • 匹配表(Probed Table):

表连接时后面存取的表,又称为内层表(Inner Table),也叫被驱动表,可以简单理解为查询的副表;

从驱动表获取一行具体数据后,会到该表中寻找符合连接条件的行。故该表一般为大表(查询结果返回较多行数的表)。

下面通过一些示例对每一种表连接方式进行详解。

二、 SORT MERGE JOIN(排序-合并连接)

内部连接过程:

  1. 第一步:生成驱动表(主表)需要的数据,按照连接操作关联列对这些数据进行排序;
  2. 第二步:生成匹配表(附表)需要的数据,按照与上面一步中对应的连接操作关联列对数据进行排序;
  3. 第三步:两边已排序的行放在一起执行合并操作(对两边的数据集进行扫描并判断是否连接);

示例:

explain plan for select * from zhxg_zhcp_cpjgb t1
join zhxg_xsxx_xsjbxx t2
on t1.xsid > t2.PKID;
select * from table(dbms_xplan.display);

执行计划:

通过上述执行计划,可见查询使用到了排序-合并连接方式。

注意事项:排序-合并连接的表无驱动顺序,两个表是对等的,哪个表在前面都可以,可以考虑在操作关联列上建立索引让其能预先排好序,连接速度可大大提高。排序合并连接其实很耗费资源,因为要对2个表/结果集进行排序,所以一般情况下,CBO是不会选择走SORT MERGE JOIN的。

应用场景:当结果集已经排过序;

适用的连接条件有: <、<=、=、>、>=

不适用的连接条件有: <> 、like

三、NESTED LOOPS(嵌套循环)

内部连接过程:

  • a) 第一步:取出主表(驱动表)的第一行数据,遍历副表(匹配表)的所有行并检查是否有匹配的,取出匹配的行放入结果集中;
  • b) 取出主表(驱动表)的第二行数据,遍历副表(匹配表)的所有行并检查是否有匹配的,取出匹配的行放入结果集中;
  • c) 若主表(驱动表)中返回了 N 行数据,则副表(匹配表)也相应的会被全表遍历 N 次;

示例:

zhxg_zhcp_cpjgb数据表的记录数为100多条;

zhxg_xsxx_xsjbxx数据表的记录数为6000多条;

下面先以记录数较少的zhxg_zhcp_cpjgb作为驱动表进行测试,观察执行计划。

explain plan for
select /*+ leading(t1) use_nl(t2) */*from zhxg_zhcp_cpjgb t1join zhxg_xsxx_xsjbxx t2on t1.xsid = t2.PKID;
select * from table(dbms_xplan.display);

执行计划:

下面以记录数较多的zhxg_xsxx_xsjbxx作为驱动表进行测试,观察执行计划。

示例:

explain plan for
select /*+ leading(t2) use_nl(t1) */*from zhxg_zhcp_cpjgb t1join zhxg_xsxx_xsjbxx t2on t1.xsid = t2.PKID;
select * from table(dbms_xplan.display);

执行计划:

可见,这里以zhxg_xsxx_xsjbxx作为驱动表测试的话,可能是因为zhxg_xsxx_xsjbxx表pkid是主键,所以这里显示的并不是嵌套循环,而是下面我们即将介绍的哈希连接方式。

注意事项:

因为主表(驱动表)的每一行都会去匹配 副表(匹配表)的所有行,所以当主表(驱动表)返回的行数尽可能少并且能高效访问副表(匹配表)(如建立适当的索引)时,效率较高。应尽可能使用限制条件(Where过滤条件)使驱动表返回的行数尽可能少,同时在匹配表的连接操作关联列上建立唯一索引(UNIQUE INDEX)或是选择性较好的非唯一索引,此时嵌套循环连接的执行效率会变得很高。若驱动表返回的行数较多,即使匹配表连接操作关联列上存在索引,连接效率也不会很高。

小总结:

  1. 嵌套循环有驱动表和被驱动表的概念,驱动顺序不同执行计划差异非常大;
  2. 驱动表只被访问一次,被驱动表被访问多次。嵌套循环访问表的次数直接受驱动表的返回记录数的影响。因此应当让实际返回记录数(A-Rows)小的表作为驱动表,返回记录数大的表作为被驱动表;
  3. 在驱动表的查询条件上建立索引可以改善查询效率;
  4. 在连接条件上建立索引也可以改善查询效率;
  5. 在被驱动表查询条件建立索引对查询效率的影响要视情况而定,不一定带来好处;

四、HASH JOIN(哈希连接)

内部连接过程:

  • a) 取出主表(驱动表)的数据集,然后将其构建成内存中的一个 Hash Table(Hash函数的Hash KEY就是连接操作关联列),创建Hash位图(bitmap);
  • b) 取出副表(匹配表)的数据集,对其中的每一条数据的连接操作关联列使用相同的Hash函数并找到对应的 a) 里的数据在 Hash Table 中的位置,在该位置上检查能否找到匹配的数据;

示例:

explain plan for select /*+ leading(t1) use_hash(t2)*/*from zhxg_zhcp_cpjgb t1join zhxg_xsxx_xsjbxx t2on t1.xsid = t2.pkid;select * from table(dbms_xplan.display);

执行计划:

小总结:

  1. 驱动表和被驱动表都是最多只被访问一次;
  2. 哈希连接的表有驱动顺序;
  3. 哈希连接不适用于的连接条件是:不等于<>,大于>,小于<,小于等于<=,大于等于>=,like;

五、CARTESIAN PRODUCT(笛卡尔积)

当两个数据表做连接,但是它们之间没有关联条件时,就会在两个row source中做笛卡儿乘积,这通常由编写代码疏漏造成(即程序员忘了写关联条件)。笛卡尔乘积是一个表的每一行依次与另一个表中的所有行匹配。在特殊情况下我们可以使用笛卡儿乘积,如在星形连接中,除此之外,我们要尽量使用笛卡儿乘积,否则,查询效率会非常慢。

假如表t1有n行,t2表有m行,笛卡尔乘积的结果就是得到n * m行结果。

explain plan for select /*+ leading(t1) use_hash(t2)*/*from zhxg_zhcp_cpjgb t1,    --忘记写关联关系zhxg_xsxx_xsjbxx t2;
select *from table(dbms_xplan.display);

执行计划:

观察上面的执行计划,CARTESIAN关键字指出了在2个表之间做笛卡尔乘积。想一下,如果两个表的数据量都非常大,那么查询效率可想而知。

六、参考资料

https://blog.csdn.net/waterxcfg304/article/details/25873265

https://blog.csdn.net/biww620/article/details/73477435/

https://www.cnblogs.com/Dreamer-1/p/6076440.html

https://blog.csdn.net/waterxcfg304/article/details/25872505

https://www.iteye.com/blog/keepwork-1949520

http://blog.itpub.net/28536251/viewspace-2140365/

Oracle表连接方式总结相关推荐

  1. oracle 内部表连接方式,oracle表连接方式

    ORACLE表连接方式及常见用法(二) /2010-12-22 13:30:13 /个人分类: 一 引言 数据仓库是目前已知的比较成熟和被广泛采用的解决方案,用于整合电信运营内部所有分散的原始业务数据 ...

  2. oracle 内部表连接方式,ORACLE 表连接方式

    一表的连接 表的连接是指在一个SQL语句中通过表与表之间的关联,从一个或多个表检索出相关的数据.连接是通过SQL语句中FROM从句的多个表名,以及WHERE从句里定义的表之间的连接条件来实现的.如果一 ...

  3. oracle连表图解,oracle 表连接方式解析

    一.表的连接 表的连接是指在一个SQL语句中通过表与表之间的关联,从一个或多个表检索出相关的数据.连接是通过SQL语句中FROM从句的多个表名,以及WHERE从句里定义的表之间的连接条件来实现的.如果 ...

  4. Oracle 表连接方式(内连接/外连接/自连接) 详解

    Oracle 表之间的连接分为三种: 1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制)        (2)右外连接(右边的表不加限制)         (3)全外连接(左 ...

  5. Oracle优化之表连接方式

    Oracle优化之表连接方式 在Oracle数据库中,两个表之间的表连接方法有排序合并连接.嵌套循环连接.哈希连接和笛卡尔连接四种 1.排序合并连接(sort merge join) 排序合并连接是一 ...

  6. oracle 表连接 大表小表_优化必备基础:Oracle中常见的三种表连接方式

    在Oracle SQL语句中,如果from后面有多个表时,表的连接方式是一个很重要的考量. 从Oracle 6开始,优化器就支持下面4种表连接方式: - 嵌套循环连接(Nested Loop Join ...

  7. Oracle表连接深入浅出

    表的连接 表的连接是指在一个SQL语句中通过表与表之间的关联,从一个或多个表检索出相关的数据.如果一个SQL语句的关联表超过两个, 那么连接的顺序如何呢?ORACLE首先连接其中的两个表,产生一个结果 ...

  8. oracle表连接查询逗号隔开_Oracle多表连接查询

    连接:将一张表中的行按照某种条件和另一张表中的行连接起来形成一个新行的的过程. 根据连接查询返回的结果,分为3类: 内连接(inner join) 外连接(outer join) 交叉连接(cross ...

  9. Oracle表连接优化思路

    Oracle表连接类型: 一.嵌套查询 嵌套循环的算法:在嵌套循环连接中,有驱动顺序,驱动表返回多少条记录,被驱动表就访问多少次,嵌套循环连接中无须排序. 嵌套循环可以快速返回两表关联的前几条数据,如 ...

  10. oracle表连接分析

    一引言 数据仓库技术是目前已知的比较成熟和被广泛采用的解决方案,用于整和电信运营企业内部所有分散的原始业务数据,并通过便捷有效的数据访问手段,可以支持企业内部不同部门,不同需求,不同层次的用户随时获得 ...

最新文章

  1. 激光雷达和相机感知融合简介
  2. YouTube测试购物功能、 2021 最值得效力的科技公司榜单、2020 移动应用年度报告等|Decode the Week...
  3. 解析微服务架构与最佳实践
  4. J2EE项目代码编写规范分享
  5. (新聞) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球
  6. java22:API-Object-String
  7. 【王佩丰】PowerPoint2010视频教程 1
  8. Python贴吧爬虫
  9. Openfile安装和使用
  10. html引入png不显示透明北京,完美解决透明png图片及透明png背景,兼容所有浏览器...
  11. 增长黑客——如何低成本实现爆发式成长
  12. CF1076C Meme Problem(韦达定理)
  13. java项目进度跟踪管理系统
  14. java数字音频最强教程之音频的王者之路(音频发烧友篇)
  15. VS2017登陆失败:我们无法刷新此账户的凭证、我们无法添加此账户发送请求时出错、评估期已结束,请登录以解除产品锁定
  16. 读书札记-曾国藩陈景润
  17. 如何搭建一个超级好用的JavaWeb框架?
  18. DSP28335与AD7606通过SPI的串行数据交互
  19. 商城笔记11——GD库
  20. 初步使用Arduino

热门文章

  1. python三种基本的数据类型有_python基本数据类型一
  2. C/C++[codeup 1927]字符串内排序
  3. 12月21诛仙服务器维护,1月21日全服停机更新维护公告
  4. c:forEach无法显示信息的可能原因以及需要注意的地方
  5. 算法中的最优化方法_学习目录
  6. 多核、多处理器、并发、并行、超线程概念总结
  7. 使用Lettuce执行命令,应该有多个返回值却只取到一个。
  8. 位运算 取某一位 java_Java 位运算妙用
  9. 简单计算机组成原理,计算机组成原理简单总结(一)
  10. 15 Android系统安全(简要)