四分钟学会Oracle嵌套循环

开发 后端
这里介绍Oracle嵌套循环,有时不遵守这个理论依据,反而会获得更好的效率。如果使用这种方法,决定使用哪个表作为驱动表很重要。有时如果驱动表选择不正确,将会导致语句的性能很差、很差。

学习Oracle时,你可能会遇到Oracle嵌套循环问题,这里将介绍Oracle嵌套循环问题的解决方法,在这里拿出来和大家分享一下。其实,该连接过程就是一个2层Oracle嵌套循环,所以外层循环的次数越少越好,这也就是我们为什么将小表或返回较小row source的表作为驱动表(用于外层循环)的理论依据。

但是这个理论只是一般指导原则,因为遵循这个理论并不能总保证使语句产生的I/O次数最少。有时不遵守这个理论依据,反而会获得更好的效率。如果使用这种方法,决定使用哪个表作为驱动表很重要。有时如果驱动表选择不正确,将会导致语句的性能很差、很差。

Oracle嵌套循环(Nested Loops, NL):

a) 如果driving row source(外部表)比较小,并且在inner row source(内部表)上有唯一索引,或有高选择性非唯一索引时,使用这种方法可以得到较好的效率。

b) NESTED LOOPS有其它连接方法没有的的一个优点是:可以先返回已经连接的行,而不必等待所有的连接操作处理完才返回数据,这可以实现快速的响应时间。

哈希连接(Hash Join, HJ):

a) 这种方法是在Oracle7后来引入的,使用了比较先进的连接理论,一般来说,其效率应该好于其它2种连接,但是这种连接只能用在CBO优化器中,而且需要设置合适的hash_area_size参数,才能取得较好的性能。

b) 在2个较大的row source之间连接时会取得相对较好的效率,在一个row source较小时则能取得更好的效率。

c) 只能用于等值连接中

笛卡儿乘积(Cartesian Product)

当两个row source做连接,但是它们之间没有关联条件时,就会在两个row source中做笛卡儿乘积,这通常由编写代码疏漏造成(即程序员忘了写关联条件)。笛卡尔乘积是一个表的每一行依次与另一个表中的所有行匹配。在特殊情况下我们可以使用笛卡儿乘积,如在星形连接中,除此之外,我们要尽量使用笛卡儿乘积,否则,自己想结果是什么吧!

注意在下面的语句中,在2个表之间没有连接。

  1. SQL> explain plan for  
  2. select emp.deptno,dept,deptno  
  3. from emp,dept  
  4. Query Plan  
  5. SLECT STATEMENT [CHOOSE] Cost=5 
  6. MERGE JOIN CARTESIAN  
  7. TABLE ACCESS FULL DEPT  
  8. SORT JOIN  
  9. TABLE ACCESS FULL EMP 

CARTESIAN关键字指出了在2个表之间做笛卡尔乘积。假如表emp有n行,dept表有m行,笛卡尔乘积的结果就是得到n * m行结果。

责任编辑:佚名 来源: 博客
相关推荐

2017-09-09 13:29:22

ARCoreAndroid移动设备

2009-11-06 14:01:15

Visual Stud

2017-09-13 09:15:28

苹果iPhone8

2024-08-05 09:30:00

2023-06-28 07:45:51

Java线程状态

2022-10-26 13:52:00

机器人谷歌

2021-12-21 15:56:13

SolarWinds

2009-11-10 17:27:01

Oracle全表扫描

2021-07-15 06:43:11

Bash调试脚本

2023-12-21 12:03:14

人工智能GPT驱动Coscientis

2009-11-20 17:06:49

Oracle数据库字符

2022-03-08 08:39:22

gRPC协议云原生

2020-05-22 10:20:27

Shiro架构字符串

2016-12-22 21:47:04

SEDLinuxUnix

2009-11-16 10:53:30

Oracle Hint

2009-10-27 17:22:27

2018-11-28 11:20:53

Python函数式编程编程语言

2009-10-22 16:18:19

Oracle表空间

2009-10-21 18:19:36

VB.NET实现拖放

2019-07-18 16:32:06

Python函数数据
点赞
收藏

51CTO技术栈公众号