【oracle概念】表联结方式

来源:互联网 发布:linux 标准输出重定向 编辑:程序博客网 时间:2024/05/22 11:08

表联结方式(逻辑分类与算法分类)

         多表联结的方式根据业务逻辑的需要,会有很多种,比如

         相等联结、不等联结、交叉联结、外联结、自联结、反联结(anti)和半联结(semi)等。

         但实际在oracle内部执行的时候,它只有三种联结算法:

         嵌套循环联结(nestedloop),排序合并联结(sort-merge)和哈希联结(hash)。

         由于逻辑处理需求的不同,这三种联结算法又会产生一些组合的联结方式。但基本算法都是归属于三大类的。我们今天要说的就是反联结(anti)和半联结(semi)。

         我们在看执行计划时,会看到下面的联结方法

         1、Nested loops

         2、Nested loopssemi

         3、Nested loopsanti

第1个即常见的嵌套循环联结。

         主要就是两张表一张作为驱动表,一张被驱动,oracle会查询出驱动表的数据(where过滤之后的数据),然后针对驱动表的每一条数据去遍历被驱动表的整表(full table)。

         Oracle会根据统计信息决定哪张表作为驱动表。

         改变表的驱动顺序可以使用提示/*+ ordered */ 使按照from后面的表顺序执行联结。或使用/*+leading(表名)*/指定驱动表。

         这里使用hint需要强调两点:

1、 如果在查询里为表使用了别名,则在hint中也要使用表的别名,否则hint不生效

2、  在执行计划里,驱动表示位于并列两个条目中上面的那个。

第2个是嵌套循环半联结

半联结是指两个表中一个表返回数据,另一张表只提供联结。

例如select * from A where exists(select * from B where A.id = B.id)

结果只从A表中产生,B表只用于联结。整个执行过程就是从A表中取出一条数据,然后跟B表进行联结,当联结操作返回一条或多条数据的时候,就可以将A表中的该条数据返回。这个操作其实在第一次匹配到B表中的数据时,就可以返回A表的该条数据了,而不需要把B表的所有数据都匹配一遍。

半联结通常用于in,exists这类语句中。

 

第3个是嵌套循环反联结

理解了半联结,理解反联结就容易多了。同理,比如

select * from A where not exists(select * from B where A.id= B.id)

对于这种查询,从A表里取出数据,当与B表的匹配中返回了第一条数据时,该数据就不符合要求,就可以直接弃掉了,而不用与B表中的所有数据都进行匹配一遍。

0 0
原创粉丝点击