Oracle 表的连接方式(1)-----Nested loop join和 Sort merge join
关系数据库技术的精髓就是通过关系表进行规范化的数据存储,并通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理。
表的三种关联方式:
nested loop:从A表抽一条记录,遍历B表查找匹配记录,然后从a表抽下一条,遍历B表........就是一个二重循环hash join:将A表按连接键计算出一个hash表,然后从B表一条条抽取记录,计算hash值,根据hash到A表的hash来匹配符合条件的记录sort merge join:将A,B表都排好序,然后做merge,符合条件的选出
对于三种连接,我们都可以使用hint来强制让优化器走:use_hash,use_nl,use_merge.
Nested Loop Join
1.执行原理
例如: select t1.*,t2.* from t1,t2 where t1.col1=t2.col2; 访问机制如下: for i in (select * from t1) loop ----t1为驱动表for j in (select * from t2 where col2=i.col1) loopdisplay results;end loop;end loop; 类似一个嵌套循环 嵌套循环执行时,先是外层循环进入内层循环,并在内层循环终止之后 接着执行外层循环再由外层循环进入内层循环中,当外层循环全部终止时,程序结束
2.步骤如下
a.确定驱动表 b.把inner 表分配给驱动表 c.针对驱动表的每一行,访问被驱动表的所有行
3.执行计划大致如下
NESTED LOOPS outer_loop --驱动表 inner_loop优化器模式为FIRST_ROWS时,我们经常会发现有大量的NESTED LOOP 这时,在返回数据给用户时,我们没有必要缓存任何数据,这是nested loop的一大亮点
4.使用场景
一般用在连接的表中有索引,并且索引选择性较好(也就是Selectivity接近1)的时候也就是驱动表的记录集比较小(<10000)而且inner表需要有有效的访问方法(Index)需要注意的是:JOIN的顺序很重要,驱动表的记录集一定要小,返回结果集的响应时间是最快的
5.和索引的关系
嵌套循环和索引就像一对孪生兄弟,一般需要共同考量与设计,这从优化器的执行机制可以看出.比如,存在2张表,一个10条记录,一个1000万条记录以小表为驱动表,则代价为:10*(通过索引在大表查询一条记录的代价)如果1000万的大表没有索引的时候,那么COST的代价可想而知因此,在多表连接时,注意被驱动表的连接字段是否需要创建索引或者连接字段与该表的其他约束条件字段上是否需要创建复合索引
Sort Merge Join
1.执行原理
select t1.*,t2.* from t1,t2 where t1.id=t2.id; 访问机制如下: 访问t1,并order by t1_1.id,这里的id代表连接字段 访问t2,并order by t2_1.id join t1_1.id = t2_1.id,依次交替 比对 归并,但无所谓驱动
2.使用场景
虽说,hash join就是用来替代sj的,但如果你的服务器的CPU资源和MEM资源都很紧张的时候,建议用SORT MERGE JOIN 因为hash join比sort merge join需要的资源更多。特别是cpu 10g sql tuning 文档上写道: On the other hand, sort-merge joins can perform better than hash joins if both of the following conditions are met: The row sources are already sorted. A sort operation does not have to be done. 所以,sj大概就用在没有索引,并且数据已经排序的情况
参考blog:http://blog.csdn.net/dba_waterbin/article/details/8547451
转载于:https://www.cnblogs.com/polestar/p/4132911.html
Oracle 表的连接方式(1)-----Nested loop join和 Sort merge join相关推荐
- 表的连接方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN
表连接方式及使用场合 NESTED LOOP 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查 ...
- 表的连接方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN【转】
表连接方式及使用场合 NESTED LOOP 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查 ...
- oracle执行计划连接方式
嵌套循环(Nested Loops (NL)) 假如有A.B两张表进行嵌套循环连接,那么Oracle会首先从A表中提取一条记录,然后去B表中查找相应的匹配记录,如果有的话,就把该条记录的信息推到等待返 ...
- oracle 非等值关联 优化,Oracle优化器、优化模式、表的连接方式(Hash Join、Nested Loop、Sort Merge Join)...
查询优化器 Oracle的查询优化器(QO)分为两种: 1. RBO:Ruled-Based Optimization, 基于规则的优化器: 2. CBO :Cost-Based Optimizati ...
- 转:ORACLE的JDBC连接方式:OCI和THIN
oracle的jdbc连接方式:oci和thin oci和thin是Oracle提供的两套Java访问Oracle数据库方式. thin是一种瘦客户端的连接方式,即采用这种连接方式不需要安装oracl ...
- Nested Loop,Sort Merge Join,Hash Join
三种连接工作方式比较: Nested loops 工作方式是从一张表中读取数据,访问另一张表(通常是索引)来做匹配,nested loops适用的场合是当一个关联表比较小的时候,效率会更高. Merg ...
- 排序合并连接(sort merge join)的原理
这三类表连接方式是oracle最基本的连接方式: 嵌套循环连接(nested loops join)原理 哈希连接(hash join) 原理 排序合并连接(sort merge join) ...
- Oracle 11g DRCP连接方式——基本原理
学习Oracle是一个复杂.繁琐的过程.在浩如烟海的Oracle官方资料.新特性.MOS资料和各种Internal知识面前,我们总是觉得力不从心.不知所措.但是,这往往也就是我们不断坚持.积累和追寻的 ...
- MYSQL表的连接方式
mysql表连接方式可以分为 1.内连接 2.外连接 3.全连接 4.交叉连接 t1表 ...
最新文章
- 实现双击IE9的Tab键关闭当前页面的功能
- Oracle从软件安装到运行的全流程
- 如何做一名优秀的电子工程师[zz]
- text 两端对齐 小程序_小程序实现文字两端对齐
- 基于VxWorks的VxBus字符设备驱动
- python如何绘制曲线图_Python matplotlib 如何绘制双Y轴曲线图?
- unipp怎么打包微信公众号_uni-app微信小程序运行和打包
- PostgreSQL如何实现MVCC (基于xmin、xmax、cmin、cmax)
- ubuntu安装软件包命令
- 通过空气质量指数AQI学习统计分析并进行预测(上)
- Android10.0通知Notification的使用这一篇就够了
- 从零教你用抖音赚钱——吸粉变现技巧
- bps、Byte、MiB、bit、bits之间的关系
- 苹果Mac实用技巧:忘记密码如何恢复?
- MYSQL数据库备份导出
- 【入门AUTOSAR网络管理测试】RSS-NOS状态转换
- 如何在百度又快有准的搜索资源
- python十个评委打分表_评委评分表
- linux libreoffice安装使用
- 咱码农为啥会(珍爱生命)远离企业应用开发
热门文章
- Python:数据类型
- 深度学习中防止过拟合的方法
- leetcode - 376. 摆动序列
- c语言模拟试题快速排序,快速排序(东软喜欢考类似的算法填空题,又如堆排序的算法等)...
- 运维笔记 - Nginx
- ubuntu + vmware7.0 gmake not found
- python给动态变量赋值_python 动态的定义变量名,并给其赋值
- 主板和cpu搭配表_主板和CPU如何搭配?主板和处理器搭配方法
- e-mobile帐号状态存在异常_Java 常见异常种类
- dhcp软件_tp-link无线路由器软件如何升级【教程图解】