Oracle表联结之嵌套循环

1.单表访问: 分表,分区,建索引,全表扫描---开并行, 永远把它 放内存,压缩

2.多表关联,任何时刻只能是2个表关联,得到的结果集再和其他表关联。

3.嵌套循环:Oracle从较小结果集(驱动表/外部表)中读取一行,然后和较大结果集(被探查表/内部表)中的所有数据逐条进行比较(嵌套循环可以用于非等值连接),如果符合规则,就放入结果集中,然后取较小结果集的下一条数据继续进行循环,直到结束。嵌套循环只适合输出少量结果集或者是用于快速输出结果集。其实相当于双层FOR循环。

SQL> select * from table(dbms_xplan.display_cursor(null,null,‘ALLSTATS LAST‘));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID bv300dy9b7gyn, child number 0
-------------------------------------
select /*+ first_rows */ e.ename,e.job,d.dname from emp e,dept d  where
e.deptno=d.deptno and e.sal<2000
Plan hash value: 3625962092
-----------------------------------------------------------------------------------------------------------
| Id  | Operation       | Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
-----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |        |      1 |  | 7 |00:00:00.14 |      18 | 8 |
|   1 |  NESTED LOOPS       |        |      1 |      4 | 7 |00:00:00.14 |      18 | 8 |
|   2 |   NESTED LOOPS       |        |      1 |      4 | 7 |00:00:00.14 |      11 | 7 |
|*  3 |    TABLE ACCESS FULL      | EMP     |      1 |      4 | 7 |00:00:00.12 |       7 | 6 |
|*  4 |    INDEX UNIQUE SCAN      | PK_DEPT |      7 |      1 | 7 |00:00:00.01 |       4 | 1 |
|   5 |   TABLE ACCESS BY INDEX ROWID| DEPT    |      7 |      1 | 7 |00:00:00.01 |       7 | 1 |
-----------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - filter("E"."SAL"<2000)
   4 - access("E"."DEPTNO"="D"."DEPTNO")

24 rows selected.

离关键字近的是驱动表,嵌套循环的rows是错误的,嵌套循环的算法,比如a NL b,如a表有1000条,从a表中取1000条数据,扫描一次a,把这1000条数据传给b,然后b表被扫描1000次,那么取出的a表的数据放在什么地方?匹配完一条然后立马返回,NL不需要PGA,因为不用缓存数据,如果多层NL,仍然是存PGA,多层NL容易引起CBC,

嵌套循环中,过滤后返回结果集的小的当驱动表,在外连接中,嵌套循环不能修改驱动表,在嵌套循环中,被驱动表的连接列一定要有索引,从上面执行计划可以看到E的deptno传值给D表的deptno,驱动表的连接列不用建索引,

nl 必须是驱动表返回数据量很少的时候才走,在sql语句中有count,group by,distinct,sum等关键字,不能走NL,如果OLTP系统,有大量的distinct,只能说明表设计有问题,用中间表把所有的关联去重解决distinct,

如果在执行计划里面有很多NL,从最里面开始搞,如果最里面错误了,那么外面的NL全部错误,由里向外不断看NL.

怎样判断NL是否是对的?1,看驱动表返回的数据量,2,看被驱动表是否走索引,3.看最终返回多少结果集。那么第3条最重要。最终返回多少结果集决定是否走NL还是HASH.

如果A NL B,返回10w条数据,如果a:b=1:1,那么a至少返回10w条数据,然后b表被扫描10w次,如果a:b=1:10,那么a至少返回1w数据,那么b表被扫描1w次,b表走索引,b表走一次索引,回表10条数据,那么b表总回表次数是10w次,所以在NL中,被驱动表不管被扫描多少次,那么回表次数是最终返回数据条数,所以嵌套循环不适合大量数据,根本原因在于回表或者回表再过滤,如果不用回表或回表再过滤,那么NL非常有效。

被驱动表的连接列要基数很高,如果基数很低,不能走NL,如1:1w,1:N,然后N太大

NL只需要SGA,不需要PGA,NL支持非等值jion,而HASH join只支持等值关联。

判断是否走NL和HASH,根据最终返回的结果集来判断,其次驱动表返回的行数,再是被驱动表的jion列的基数。

错误NL,1.单次返回大量数据,如100w

时间: 2024-10-10 15:38:34

Oracle表联结之嵌套循环的相关文章

oracle表连接之----〉嵌套循环(Nested Loops Join)

嵌套循环连接(Nested Loops Join)是一种两个表在做表连接时依靠两层嵌套循环(分别为外层循环和内存循环)来得到连接结果集的表连接方法.即外层循环对应的驱动结果集有多少条记录,遍历被驱动表的内层循环就要做多少次,这就是所谓的"嵌套循环"的含义. 对于嵌套循环连接的优缺点及适用场景如下: a,如果驱动表所对应的驱动结果集的记录数较少,同时在被驱动表的连接列上又存在唯一性索引(或者在被驱动表的连接列上存在选择性好的非唯一性索引),那么此时使用嵌套循环连接的执行效率就会非常高:但

oracle表连接

oracle表连接又被问到了,感觉细节了解还是远远不够啊,从网上找资料学习之.转载的. 在查看sql执行计划时,我们会发现表的连接方式有多种,本文对表的连接方式进行介绍以便更好看懂执行计划和理解sql执行原理. 一.连接方式:         嵌套循环(Nested  Loops (NL))       (散列)哈希连接(Hash Join (HJ))     (归并)排序合并连接(Sort Merge Join (SMJ) ) 二.连接说明:     1.Oracle一次只能连接两个表.不管查

oracle表之间的连接之-----&gt;哈希连接(Hash Join)

哈希连接(HASH JOIN)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集的表连接方法. 对于排序合并连接,如果两个表在施加了目标SQL中指定的谓词条件后得到的结果集很大而且需要排序,则排序合并连接的执行效率一定不高:而对于嵌套循环连接,如果驱动表所对应的驱动结果集的记录数很大,即便在被驱动表的连接列上存在索引,此时使用嵌套循环连接的执行效率也会同样不高.为了解决这个问题,于是ORACLE引进了哈希连接.在ORACLE 10g及其以后的版本中,优化器 (实际上是CBO,因为哈希连接仅

oracle表之间的连接之------&gt;排序合并连接(Merge Sort Join)

排序合并连接 (Sort Merge Join)是一种两个表在做连接时用排序操作(Sort)和合并操作(Merge)来得到连接结果集的连接方法. 对于排序合并连接的优缺点及适用场景如下: a,通常情况下,排序合并连接的执行效率远不如哈希连接,但前者的使用范围更广,因为哈希连接只能用于等值连接条件,而排序合并连接还能用于其他连接条件(如<,<=,>.>=) b,通常情况下,排序合并连接并不适合OLTP类型的系统,其本质原因是对于因为OLTP类型系统而言,排序是非常昂贵的操作,当然,如

深入理解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的三大表连接技术              在早期版本,

SQL Server统计信息偏差影响表联结方式案例浅析

原文:SQL Server统计信息偏差影响表联结方式案例浅析   我们知道数据库中的统计信息的准确性是非常重要的.它会影响执行计划.一直想写一篇关于统计信息影响执行计划的相关博客,但是都卡在如何构造一个合适的例子上,所以一直拖着没有写.巧合,最近在生产环境中遇到这么一个案例,下面对案例中的相关信息做了脱敏处理,有些中间步骤也省略了,只关注核心部分SQL.如下所示,同事反馈一个SQL语句执行很慢.   UPDATE  b SET     b.[Status] = '已扫描,未签收' ,      

Oracle表空间

Oracle表空间,布布扣,bubuko.com

oracle 表分区例子

oracle表分区详解-一步一步教你oracle分区表详解   1.创建三个不同的表空间,模拟在不同磁盘上的保存不同范围的数据    create tablespace test01 datafile '/u01/app/oracle/oradata/orcl02/test01.dbf' size 500m; ---数据文件可以不再同一存储上  create tablespace test02 datafile '/u01/app/oracle/oradata/orcl02/test02.dbf

【Oracle 常用查询】oracle表空间使用率统计查询

参考1 --查询表空间使用情况 SELECT Upper(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)", To_char(Round(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99') || '