`
mikixiyou
  • 浏览: 1098985 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:353152
社区版块
存档分类
最新评论

Oracle表连接之嵌套循环

阅读更多

在数据库系统中执行一个查询SQL语句,如果这个查询只操作一张表,那么仅仅涉及到这个表及关联对象的访问。访问方式通常是三种:全表扫描、全索引扫描和索引扫描。
如果这个查询操作两张及以上的表,那么需要操作的表之间的连接关系就变得至关重要。
数据库系统执行该SQL时,永远都是两个结果集关联。
例如,
操作三张表,那么就是其中两张表关联出一个结果集,和第三张表关联。
操作四张表,那么就是其中两张表关联出一个结果集,和第三张表关联出一个结果集,再和第四张表关联出最后的结果集。当然也可能是两两关联出两个结果集,再相互关联得到最后的结果集。
操作5张表,各个表之间的关联方式就更复杂了。

这些描述就是数据库系统用来根据操作表的不同排列和组合而生成不同的执行计划。
Oracle数据库系统会使用一种机制,来决定哪一种组合性能最好。这种机制称为基于成本的优化器(Cost-Based Optimization,简称为CBO)。

因为操作多表时,都会按照两表关联操作,最终得出需要的结果集。

Oracle数据库系统将两表关联方式主要分为三种。

这里介绍一下嵌套循环 (Nested  Loops 简称NL) 的连接方式。

嵌套循环,顾名思义就是将一个表为出发点,将该表全部记录逐条去遍历另外一张表的记录,符合条件的就是写入结果集。

例如:
select a.*, b *
from EMP a, DEPT b
where a.DEPTNO = b.DEPTNO;

如使用emp表为出发点,将emp表的记录都查询出来为m条,再将这m条记录的字段deptno值,逐条和dept表的所有记录的deptno字段值匹配,假如dept表有n条记录。
匹配出来的记录符合条件就写入到结果集中。

那么这样关联操作过程中,操作的记录条数就是:先是emp表的m条,接着是dept表n条,但查了m遍,总的记录数就是m+m*n。

如使用dept表为出发点,去遍历emp表,那么总的记录数就是n+n*m。

出发点不同的连接方法,需要的成本就是不一样的。CBO会去最小的那个。

这里作为出发点的表,官方术语将其称为外部表,也叫驱动表。

使用伪代码来表示一下嵌套循环连接

declare
begin
  for outer_table in (select * from emp) loop
     
    for inner_table in (select *
                          from dept                       
                         where DEPTNO = outer_table.DEPTNO) loop
      dbms_output.put_line(inner_table.*, outer_table.*);
    end loop;
 
  end loop;
end;

基于嵌套连接的特点,我们可以想得到,它在两个关联表的数据量相差比较大时采用,但整体上数据量都不应该太大。该关联方式适用于得到小数据量的查询操作。

分享到:
评论

相关推荐

    ORACLE表连接方式

    本文将对Oracle中的几种主要表连接方式进行详细介绍:内连接(Inner Join)、自然连接(Natural Join)、左外连接(Left Outer Join)、右外连接(Right Outer Join)、笛卡尔连接(Cartesian Join)、索引连接...

    ORACLE表连接方式分析及常见用法

    Oracle提供了多种连接类型,包括嵌套循环连接、群集连接、排序合并连接、笛卡尔连接、哈希连接和索引连接。 1. 嵌套循环连接(NESTED LOOP JOIN):这种连接方式适用于外部表小且内部表有高效索引的情况。Oracle会...

    Oracle数据库3种主要表连接方式对比

    本文将详细介绍三种主要的表连接方式:嵌套循环连接(Nested Loop Join,简称NL Join)、排序合并连接(Sort Merge Join,简称SM Join)以及散列连接(Hash Join)。我们将探讨它们的特点、优势与劣势,以便于在实际...

    Oracle中表的连接及其调整.

    本文将深入探讨 Oracle 中的三种主要连接方式:嵌套循环连接(Nested Loop)、排序合并连接(Sort Merge)和哈希连接(Hash Join),并结合案例分析其工作原理和优化策略。 1. 嵌套循环连接(Nested Loop) 嵌套...

    Oracle数据库表连接笔记.doc

    Oracle数据库提供了多种连接方法,包括嵌套循环连接、排序合并连接、集群连接、笛卡尔连接和散列连接,以及特定情况下的索引连接。每种连接方式都有其适用场景和性能特点。 1. 嵌套循环连接(Nested Loops Join)是...

    几种常用的表连接方式

    本文将深入探讨四种常用的表连接方式:嵌套循环连接、排列合并连接、哈希连接以及索引连接,并详细阐述每种连接方式的工作原理、适用场景及其优缺点。 #### 1. 嵌套循环连接(Nested Loop Join) 嵌套循环连接是最...

    ORACLE数据库SQL优化---表连接类型.docx

    - 嵌套循环连接(Nested Loops Join):驱动表的每一行与被驱动表的每一行进行比较,适合小表连接大表的情况。 - 哈希连接(Hash Join):驱动表的数据被哈希化,然后与被驱动表的数据进行匹配,适合处理大数据量...

    几种常用的表连接方式.doc

    本文档主要介绍了四种常用的表连接方式:嵌套循环连接、排列合并连接、哈希连接和索引连接。 1. **嵌套循环连接**: - 嵌套循环连接是通过遍历外部表(驱动表)的每一行,并与内部表的每一行进行比较来实现的。...

    oracle数据库性能调优(3)

    本篇将继续深入探讨Oracle数据库性能调优的诸多方面,重点关注于嵌套循环执行计划,这是数据库多表操作中常见的连接方式之一。 首先,了解单表执行计划是理解多表执行计划的基础,单表执行计划涉及到了对单个表进行...

    Oracle中三种表连接算法的总结

    Oracle数据库在处理表之间的连接操作时,提供了三种主要的连接算法:嵌套循环连接(Nested Loop Join)、排序合并连接(Sort Merge Join)和哈希连接(Hash Join)。这些算法各有特点,适用于不同的数据处理场景。 ...

    oracle 优化资料

    - **嵌套循环连接(Nested Loop Join)**:适用于小表连接大表的情况,每次从大表中取出一行与小表中的每一行进行匹配。 - **群集连接(Cluster Join)**:在集群数据库中,当连接的表存储在同一集群内时使用,已很少...

    Oracle优化常用概念.pptx

    优点:当缺乏索引或者索引条件模糊时,哈希连接连接比嵌套循环有效;通常比排序合并连接快;缺点:为建立哈希表,需要大量内存。 执行计划 执行计划是 Oracle 优化器生成的最佳执行路径,包括索引的使用、表的访问...

    为什么oracle有时不用索引来查找数据

    3. **连接类型**:Oracle支持三种连接方式:排序合并连接(Sort Merge Join, SMJ)、哈希连接(Hash Join, HJ)和嵌套循环连接(Nested Loop Join, NL)。在两张表连接时,只有嵌套循环连接能够在内表的目标列上有效...

    阿里巴巴ORACLE DBA面试题.pdf

    嵌套循环连接适合小数据集的表连接,它通过驱动表(外表)与内表的匹配行进行连接。该方式要求驱动表的连接字段上有索引以减少I/O成本。如果返回的结果集较大,则嵌套循环连接效率较低。 哈希连接在大数据集连接时...

    oracle执行计划详解

    2. 嵌套循环(Nested Loops, NL): 3. 哈希连接(Hash Join, HJ): 另外,还有笛卡儿乘积(Cartesian Product)。 总结 Oracle 连接方法 Oracle 执行计划是数据库管理系统中一个非常重要的概念。了解 Oracle...

    oracle 数据库性能调优技术 4 中文

    它通过构建哈希表来实现两个表之间的快速连接,相比于嵌套循环连接,散列连接能显著减少所需的IO操作数量,从而提高查询效率。下面我们将从几个方面来探讨散列连接的优势及其工作原理。 #### 为什么需要散列连接? ...

    oracle性能优化技巧

    - 在复杂的查询中,避免嵌套循环结构,因为它们会导致大量的数据读取和处理开销。 10. **别名的使用**: - 为表和列使用别名可以提高查询的可读性,并且在某些情况下还可以提高性能。 11. **EXISTS与IN的比较**...

    oracle sql 语句暗示 hints

    - **`/*+ NESTED_LOOPS (表1 表2) */`**:使用嵌套循环连接方法。 - **`/*+ NO_PARALLEL (表1 表2) */`**:禁止并行执行。 ##### 2.3 并行执行暗示 并行执行暗示用于控制查询的并行程度,有助于提高大数据量处理时...

Global site tag (gtag.js) - Google Analytics