表连接方式

--表连接方式
1.Hash join:优化器使用两个表中较小的表(或数据源)利用连接键(HASH KEY)在内存中建立散列表(HASH表),然后扫描较大的表并探测散列表,找出与散列表匹配的行。如果hash表太大则无法在内存中完全放入,这时候优化器就分成不同区,把不能放入内存的分区放入到磁盘临时段,此时有较大的临时段来提高i/o性能。默认值指定方式:USE_HASH(table_name1 table_name2)

2.Nested loops:工作方式是从一张表(驱动表outer table,结果集比较小)中读取数据,访问另一张表(通常是索引,inner table)来做匹配,nested loops适用的场合是当一个关联表比较小的时候,效率会更高。默认值指定方式:USE_NL(table_name1 table_name2)

3.Merge Join 是先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配,因为merge join需要做更多的排序,所以消耗的资源更多。 通常来讲,能够使用merge join的地方,hash join都可以发挥更好的性能。
默认值指定方式:USE_MERGE(table_name1 table_name2)

4.Semi-join
通常出现在使用了exists或in的sql中,所谓semi-join即在两表关联时,当第二个表中存在一个或多个匹配记录时,返回第一个表的记录;
与普通join的区别在于semi-join时,第一个表里的记录最多只返回一次;

5.Anti-join
而anti-join则与semi-join相反,即当在第二张表没有发现匹配记录时,才会返回第一张表里的记录;
当使用not exists/not in的时候会用到,两者在处理null值的时候会有所区别

何时选择anti-join
1 使用not in且相应列有not null约束
2 not exists,不保证每次都用到anti-join
当无法选择anti-join时,oracle常会采用filter替代
--not exists与not in的区别在于not exists不受null值影响

6.迪卡尔积连接:当两个表没有任何连接条件时会使用此连接方式。

注意
Oracle在解析sql时候会尽可能的把子查询转换为表连接
Oracle在以下情况不会使用semi-join
1、 使用distinct或者union
2、 Exists/in子查询中使用了or

Hash_sj/merge_sj/nl_sj都是关于semi-join的一些hint

时间: 2024-10-14 07:17:42

表连接方式的相关文章

关联操作方式(表连接方式)

NESTED LOOPS(嵌套循环连接) 在嵌套循环连接中,oracle从第一个行源中读取第一行,然后和第二个行源中的数据进行对比. 所有匹配的记录放在结果集中,然后Oracle将读取第一个行源中的下一行.按这种方式直至第一个数据源中的所在行都经过处理. 第一个记录源通常称为外部表,或者驱动表,相应的第二个行源称为内部表.使用嵌套循环连接是一种从连接结果中提取第一批记录的最快速的方法. 在驱动行源表(就是您正在查找的记录)较小.或者内部行源表已连接的列有惟一的索引或高度可选的非惟一索引时, 嵌套

深入理解Oracle表(3):三大表连接方式详解之Nested loop join和 Sort merge join

深入理解Oracle表(3):三大表连接方式详解之Nested loop join和 Sort merge join 分类: Oracle 基础管理 Oracle SQL 开发2013-01-28 00:33 2536人阅读 评论(1) 收藏 举报 关系数据库技术的精髓就是通过关系表进行规范化的数据存储       并通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理       这里Think愿意和大家一起来学习分享Oracle的三大表连接技术              在早期版本,

Oracle 表连接方式(1)---

Oracle 表之间的连接分为三种: 1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两表都不加限制) 3. 自连接(同一张表内的连接) SQL的标准语法: select table1.column,table2.column from table1 [inner | left | right | full ] join table2 on table1.column1 = table2.column2; in

数据库多表连接方式介绍-HASH-JOIN

1.概述 hash join是一种数据库在进行多表连接时的处理算法,对于多表连接还有两种比较常用的方式:sort merge-join 和 nested loop. 为了比较清楚的介绍hash join的使用场景以及为何要引入这样一种连接算法,这里也会顺带简单介绍一下上面提到的两种join方式. 连接方式是一个什么样的概念,或者说我们为何要有而且有好几种,对于不太了解数据库的人来讲可能这些是开头的疑惑.简单来讲,我们将数据存在不同的表中,而不同的表有着它们自身的表结构,不同表之间可以是有关联的,

详解Oracle多种表连接方式

转载:http://database.51cto.com/art/201009/228094.htm 1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两表都不加限制) 3. 自连接(同一张表内的连接) SQL的标准语法: select table1.column,table2.column from table1 [inner | left | right | full ] join table2 on tab

oracle多表连接方式Hash Join Nested Loop Join Merge Join

在查看sql执行计划时,我们会发现表的连接方式有多种,本文对表的连接方式进行介绍以便更好看懂执行计划和理解sql执行原理. 一.连接方式:        嵌套循环(Nested  Loops (NL))      (散列)哈希连接(Hash Join (HJ))    (归并)排序合并连接(Sort Merge Join (SMJ) ) 二.连接说明:    1.Oracle一次只能连接两个表.不管查询中有多少个表,Oracle 在连接中一次仅能操作两张表.    2.当执行多个表的连接时,优化

深入理解Oracle表(5):三大表连接方式详解之Hash Join的定义,原理,算法,成本,模式和位图...

Hash Join只能用于相等连接,且只能在CBO优化器模式下.相对于nested loop join,hash join更适合处理大型结果集       Hash Join的执行计划第1个是hash表(build table),第2个探查表(probe table),一般不叫内外表,nested loop才有内外表       Hash表也就是所谓的内表,探查表所谓的外表       两者的执行计划形如:       nested loop           outer table    

sql数据库的表连接方式图文详解

sql数据库表连接,主要分为:内连接.外连接(左连接.右连接 .全连接).交叉连接,今天统一整合一下,看看他们的区别. 首先建表填充值. 学生表:student(id,姓名,年龄,性别 ) 成绩表:score(id,学生id,成绩) 一.内连接(inner join……on) select student.* ,Score.* from student inner join Score on student.id=Score.sid 查询结果如下: 关系如下图: 总结:inner join取两表

Oracle 表连接方式

1.嵌套循环联结(NESTED LOOPS)2.哈希联结(HASH JOIN)3.排序合并联结(MERGE JOIN)4.半联结(in/exists)5.反联结(not in/not exists)6.笛卡儿联结(MERGE JOIN CARTESIAN)7.外连联结    left outer join    right outer join    full outer join8.索引联结 左外连接:以左边的表为基准,右边连接的表没有返回值时为空. 右外连接:以右边的表为基准,左边连接的表没