关系数据库技术的精髓就是通过关系表进行规范化的数据存储,并通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理。

表的三种关联方式:

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) loop
display 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)的时候
也就是驱动表的记录集比较小(<)而且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

Oracle 表的连接方式(1)-----Nested loop join和 Sort merge join的更多相关文章

  1. 三大表连接方式详解之Nested loop join和 Sort merge join

    在早期版本,Oracle提供的是nested-loop join,两表连接就相当于二重循环,假定两表分别有m行和n行       如果内循环是全表扫描,时间复杂度就是O(m*n)       如果内循 ...

  2. Nested Loops,Hash Join 和 Sort Merge Join. 三种不同连接的不同:

    原文:https://blog.csdn.net/tianlesoftware/article/details/5826546 Nested Loops,Hash Join 和 Sort Merge ...

  3. Oracle 表的连接方式

    1. 连接说明 ① Oracle一次只能连接两个表.不管查询中有多少个表,Oracle 在连接中一次仅能操作两张表. ② 当执行多个表的连接时,优化器从一个表开始,将它与另一个表连接:然后将中间结果与 ...

  4. Nested loops、Hash join、Sort merge join(三种连接类型原理、使用要点)

    nested loop 嵌套循环(原理):oracle从较小结果集(驱动表.也可以被称为outer)中读取一行,然后和较大结果集(被侦查表,也可以叫做inner)中的所有数据逐条进行比较(也是等值连接 ...

  5. Oracle 表的连接方式(2)-----HASH JOIN的基本机制2

    Hash算法原理 对于什么是Hash算法原理?这个问题有点难度,不是很好说清楚,来做一个比喻吧:我们有很多的小猪,每个的体重都不一样,假设体重分布比较平均(我们考虑到公斤级别),我们按照体重来分,划分 ...

  6. Oracle 表的连接方式(2)-----HASH JOIN的基本机制3

    HASH JOIN的模式 hash join有三种工作模式,分别是optimal模式,onepass模式和multipass模式,分别在v$sysstat里面有对应的统计信息: SQL> sel ...

  7. Oracle 表的连接方式(2)-----HASH JOIN的基本机制1

    我们对hash join的常见误解,一般包括两个: 第一个误解:是我们经常以为hash join需要对两个做join的表都做全表扫描 第二个误解:是经常以为hash join会选择比较小的表做buil ...

  8. NESTED LOOPS & HASH JOIN & SORT MERGE JOIN

    表连接方式及使用场合 NESTED LOOP 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查 ...

  9. Oracle 三种连接方式 NESTED LOOP HASH JOIN SORT MERGE JOIN

    NESTED LOOP: 对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择.在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大( ...

随机推荐

  1. js兼容性问题

    javscript 浏览器兼容性问题: scrollTop = document.documentElement.scrollTop || document.body.scrollTop; scrol ...

  2. Android小项目之十 应用程序更新的签名问题

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...

  3. 重构21-Collapse Hierarchy(去掉层级)

    我们通过提取子类来下放职责.,当我们意识到不再需要某个子类时,可以使用Collapse Hierarchy重构.如果某个子类的属性(以及其他成员)可以被合并到基类中,这时再保留这个子类已经没有任何意义 ...

  4. POJ 1182 食物链 (并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 50601   Accepted: 14786 Description ...

  5. Differential Geometry之第二章曲线的局部理论

    第二章.曲线的局部理论 2.1 曲线的概念 关于非正则曲线的讨论: ,这是个非正则点(尖点),且它是非正则曲线. 直观上,间断点,孤立点,结点(交叉点),尖点是非正则点. 有记载说:当同一条曲线用不同 ...

  6. C++之算法题模板

    main.cpp: #include <iostream>#include <vector>#include <cstring>#include <cstdi ...

  7. canvas-js贝塞尔曲线代码在线生成工具

    详细内容请点击 canvas贝塞尔曲线代码在线生成工具 可以快速生成二次.三次贝塞尔曲线的源码生成器,方便经常使用到canvas画图的同学使用,可以直接预览效果随意画出自己想要的图像. 生成源码效果预 ...

  8. HTML_创建易用的Web表单

    首先创建一个表单域集合fieldset fieldset元素允许Web开发者将主题相关的表单组合在一起 <fieldset></fieldset> 要说明的是本例子中每个表单都 ...

  9. 从ASP.NET的web1子界面刷新打开web1的web0父界面

    单击web0界面的按钮bt1触发一下代码: protected void btnSave_Click(object sender, EventArgs e) { string parentJs = @ ...

  10. Java之阶乘数的计算

    说起“阶乘数”,我们应该都不会感到陌生.当老师布置了这样的作业,我们大多数人是一贯用笔算,还有的同学会用计算机去计算.数学是讲究原理和方法的,我们知其然,也要知其所以然.下面我们就用编程来计算阶乘数. ...