【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表中的所有数据都进行匹配一遍。
- 【oracle概念】表联结方式
- ORACLE 表间的联结方式
- 联结方式
- PostgreSQL 联结方式--hash联结
- 联结表
- PostgreSQL 联结方式--嵌套循环联结
- PostgreSQL 联结方式--排序-合并联结
- oracle 嵌套循环联结
- oracle 排序-合并联结
- oracle 笛卡尔联结
- oracle 联结方法
- SQl 表的联结
- MySQL联结表
- 表的联结方法
- SQL-联结表
- MySQL-联结表
- mysql表联结
- 15 联结表
- Ubuntu安装iSCSI HBA
- 使用nodejs,express,mysql,Bootstrap开发采购招标网站(四)Bootstrap-table实现Ajax新增修改数据
- Mac添加环境变量
- 手机App测试总结
- Mahout系列之Canopy聚类算法分析
- 【oracle概念】表联结方式
- python requests 模块学习
- MyBatis+MySQL 传入参数
- 被脱裤也不怕,密码安全可以这样保障
- 2套RAC容灾切换+更改容灾RAC的虚拟ip和scan-ip
- 数学之路(机器学习实践指南)-文本挖掘与NLP(4)
- Tkinter教程之Label篇
- 打印近似圆&方法的理解
- bitscount函数的重写