`
leili
  • 浏览: 179667 次
社区版块
存档分类
最新评论

Oracle-表连接浅析

阅读更多

Oracle-表连接简介

表的连接是指在一个SQL语句中通过表与表之间的关联,从一个或多个表检索出相关的数据。连接是通过SQL语句中FROM从句的多个表名及WHERE从句里定义的表之间的连接条件来实现的。如果一个SQL语句的关联表超过两个,那么连接的顺序如何呢?ORACLE首先连接其中的两个表,产生一个结果集;然后将产生的结果集与下一个表进行关联....继续这个过程,直到所有的表都连接完成;最后产生所需的数据。

嵌套循环连接(NESTED LOOP JOIN)

排序合并连接(SORT MERGE JOIN)

哈希连接(HASH JOIN)

1.    嵌套循环连接(NESTED LOOP JOIN)

嵌套循环连接的内部处理流程:

1)   Oracle 优化器根据基于规则RBO或基于成本CBO的原则,选择两个表中的一个作为驱动表,并指定其为外部表。

2)   Oracle 优化器再将另外一个表指定为内部表。

3)   从外部表中读第一行,然后和内部表中的数据逐一进行对比,所有匹配的记录放在结果集中。

4)   读取外部表中的第二行,再和内部表中的数据逐一进行对比,所有匹配的记录添加到结果集中。

5)   重复上述步骤,直到外部表中的所有纪录全部处理完。

6)   最后产生满足要求的结果集。

在驱动表(外部表)较小、或者内部表已连接的列有惟一的索引或高度可选的非惟一索引时, 嵌套循环连接效果是比较理想的。嵌套循环连接比其他连接方法有优势,它可以快速地从结果集中提取第一批记录,而不用等待整个结果集完全确定下来。这样,在理想情况下,终端用户就可以通过查询屏幕查看第一批记录,而在同时读取其他记录。不管如何定义连接的条件或者模式,都可以使用嵌套循环连接,所以嵌套循环连接是非常灵活的。

然而,如果内部行源表(读取的第二张表)已连接的列上不包含索引或者索引不是高度可选时, 嵌套循环连接效率是很低的。如果驱动表的记录非常庞大时,其他的连接方法可能更加有效。

可以在SQL语句中添加HINTS(/*+ use_nl(a b) */),强制ORACLE优化器产生嵌套循环连接的执行计划。通过查询SQL语句的执行计划可以看出哪个表是外部表,哪个为内部表。

2.    哈希连接(HASH JOIN)

当内存能够提供足够的空间时,哈希连接是Oracle优化器通常的选择。哈希连接中,优化器根据统计信息,首先选择两个表中的小表,在内存中建立这张表的基于连接键的哈希表;优化器再扫描表连接中的大表,将大表中的数据与哈希表进行比较,如果有相关联的数据,则将数据添加到结果集中。

当哈希表构建完成后,进行下面的处理:

1)   第二个大表进行扫描

2)   如果大表不能完全cache到可用内存的时候,大表会分成很多分区

3)   大表的第一个分区cache到内存

4)   对大表第一个分区的数据进行扫描,并与哈希表进行比较,如果有匹配的纪录,添加到结果集里

5)   与第一个分区一样,其它的分区也类似处理。

6)   所有的分区处理完后,ORACLE对产生的结果集进行归并,汇总,产生最终的结果。

当连接的两个表是用等值连接并且表的数据量比较大时,优化器才可能采用哈希连接。只有在数据库初始化参数HASH_JOIN_ENABLED设为True,并且为参数PGA_AGGREGATE_TARGET设置了一个足够大的值的时候,Oracle才会使用哈希连接。HASH_AREA_SIZE是向下兼容的参数,但在Oracle9i之前的版本中应当使用HASH_AREA_SIZE。当表连接中的小表能够完全cache到可用内存的时候,哈希连接的效果最佳。哈希连接的成本只是两个表从硬盘读入到内存的成本。

但是,当哈希表过大或可用内存有限,哈希表不能完全CACHE到内存。随着满足连接条件的结果集的增加,可用内存会随之下降,这时已经CACHE到内存的数据可能会重新写回到硬盘去。如果出现这种情况,系统的性能就会下降。

可以在SQL语句中添加HINTS(/*+ use_hash(a b)*/),强制ORACLE优化器产生哈希连接的执行计划。

3.    排序合并连接(SORT MERGE JOIN)

排序合并连接内部处理的流程:

1)   优化器判断第一个源表是否已经排序,如果已经排序,则到第3步,否则到第2步。

2)   第一个源表排序

3)   优化器判断第二个源表是否已经排序,如果已经排序,则到第5步,否则到第4步。

4)   第二个源表排序

5)   已经排过序的两个源表进行合并操作,并生成最终的结果集。

在缺乏数据的选择性或者可用的索引时,或者两个源表都过于庞大(所选的数据超过表记录数的5%)时,排序合并连接将比嵌套循环连更加高效。

排列合并连接需要比较大的临时内存块用于排序,这将导致在临时表空间占用更多的内存和磁盘I/O。可以在SQL语句中添加HINTS(/*+use_merge(a b) */),强制ORACLE优化器产生排序合并连接。

4.    比较

表连接的比较:

 

Oracle学习-表连接
 

 

结束语 
深入地理解和掌握oracle的表连接对于优化数据库的性能至关重要。由于优化器选择方式的不同,以及统计信息的缺失或统计信息的不准确,ORACLE自动选择的表连接方式不一定是最优的。当出现多表连接时,需要仔细分析是否有更佳的连接条件。根据系统的特点,必要时可以在SQL中添加HINTS,从而改变SQL的执行计划,从而达到性能优化的目的

Oracle的优化器的RBO和CBO方式:

1、基于规则的优化方式(Rule-Based Optimization,简称为RBO)

优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则,对数据是不敏感的。它只借助少量的信息来决定一个sql语句的执行计划,包括:

1)sql语句本身

 2)sql中涉及到的table、view、index等的基本信息

3)本地数据库中数据字典中的信息(远程数据库数据字典信息对RBO是无效的)

例如:我们常见的,当一个where子句中的一列有索引时去走索引。但是需要注意,走索引不一定就是优的,比如一个表只有两行数据,一次IO就可以完成全表的检索,而此时走索引时则需要两次IO,这时全表扫描(full table scan)的效率更优。

2、基于代价的优化方式(Cost-Based Optimization,简称为CBO)

它是看语句的代价(Cost),通过代价引擎来估计每个执行计划所需的代价,该代价将每个执行计划所耗费的资源进行量化,CBO根据这个代价选择出最优的执行计划。一个查询所耗费的资源可分为三部分:I/O代价、CPU代价、NETWORK代价。I/O是指把数据从磁盘读入内存时所需代价(该代价是查询所需最主要的,所以在优化时一个基本原则就是降低I/O总次数);CPU代价是指处理内存中数据所需的代价,数据一旦读入内存,当我们识别出我们所要的数据后,会在这些数据上执行排序(sort)或连接(join)操作,这需要消耗CPU资源;对于访问远程节点来说,network代价的花费也是很大的。

优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小、有多少行、每行的长度等信息。这些统计信息起初在库内是没有的,是做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些应及时更新这些信息(dbms_stat.analyze)。

如星型连接排列查询,哈希连接查询,函数索引,和并行查询等一些技术都是基于CBD的。

4
2
分享到:
评论

相关推荐

    ORACLE数据库连接配置浅析及故障排除

    ORACLE数据库连接配置浅析及故障排除

    ORACLE数据库连接配置浅析及故障排除.pdf

    ORACLE数据库连接配置浅析及故障排除.pdf

    Oracle 中表数据的存储原理浅析

    ### Oracle中表数据的存储原理浅析 #### 1. 引言 在Oracle数据库中,当用户创建一个表时,Oracle会自动在相应的表空间内为此表分配数据段以容纳其数据。用户可以通过多种方式控制数据段的空间分配与使用: - 通过...

    Oracle_TNS浅析.doc

    ### Oracle TNS浅析 #### 一、Oracle TNS简介 **TNS( Transparent Network Substrate)** 是Oracle Net的一部分,主要用于管理和配置Oracle数据库与客户端之间的连接。它为客户端提供了透明的网络通信机制,使得...

    oracle exadata技术浅析

    oracle exadata技术浅析 自从 Oracle 和 HP 推出 Exadata 之后,我就很关注这个产品,之前也写了一篇Oracle Database Machine介绍它。去年,Oracle和SUN合并后,推出了Oracle Exadata V2,相比较上一代产品有几个...

    Oracle数据库性能优化浅析.pdf

    在涉及多表连接时,选择合适的表连接顺序至关重要,因为不恰当的顺序可能会导致查询效率的下降。通常来说,应该选择驱动表,也就是能通过其过滤器去除最多行的表,作为WHERE子句后的第一个表。此外,为了提高效率,...

    Oracle和SQL Server浅析

    Oracle 提供了一个特殊的表 Dual,用于在没有实际数据表的情况下执行查询。例如,如果你需要返回一个常量,你可以这样做: Oracle: ```sql SELECT 'x' FROM dual; ``` SQL Server: ```sql SELECT 'x'; ``` 在处理...

    Oracle数据库监听配置浅析与故障定位.pdf

    ### Oracle数据库监听配置浅析与故障定位 #### 一、引言 Oracle数据库作为全球市场占有率最高的商业数据库之一,以其强大的功能和广泛的适用性而著称。然而,Oracle数据库的复杂性也为用户带来了一定的学习曲线和...

    常用ORACLE知识浅析1

    本文将对一些常见的Oracle知识进行浅析,主要包括数据库的概念、实例结构、环境变量、连接方式、以及一些基础的SQL函数。 首先,我们需要理解数据库和Oracle实例的区别。数据库是存储数据的物理结构,包括数据文件...

    浅析Oracle数据库的逻辑备份与恢复.pdf

    标题和描述中提到的是对Oracle数据库的逻辑备份与恢复进行浅析。Oracle数据库是业界广泛使用的关系型数据库管理系统,它支持逻辑备份和物理备份。逻辑备份主要通过Oracle提供的工具如EXP(Export)和IMP(Import)来...

    oracle TNS 浅析

    在多数情况下,为了使客户端能够成功连接到Oracle数据库,必须正确配置TNS。不过,也有例外,比如通过JDBC(Java Database Connectivity)等其他方式连接Oracle时,可以不依赖TNS。 TNS涉及到的主要配置文件包括...

    浅析Oracle数据库的性能优化.pdf

    本文将浅析Oracle数据库的性能优化,主要关注数据库服务器性能和数据库配置两个关键领域。 首先,数据库服务器性能是决定整体系统性能的核心。服务器的性能由操作系统和硬件配置共同决定。操作系统的选择和优化对于...

    JDBC连接MySQL数据库的方法浅析.pdf

    【JDBC连接MySQL数据库的方法浅析】 JDBC(Java Database Connectivity)是Java语言中用于与关系型数据库交互的标准API,由Sun Microsystems(现为Oracle公司)制定。它为Java开发者提供了一个统一的接口,用于访问...

    Oracle表空间设置和管理浅析

    临时表空间主要用于存储临时对象,如排序和连接操作产生的中间结果。创建临时表空间的参数与永久表空间类似,但通常更关注快速创建和删除,而不是长期存储。 1. **EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M**:设置...

    浅析基于Oracle数据库的Delphi开发技术在重型装备制造企业中的应用.pdf

    在实际应用中,Delphi通过OracleSession控件连接Oracle数据库,OracleDataSet控件用于提取数据,dxDBGrid和RM-GridReport控件则用于在用户界面上直观地展示数据。Oracle-Query控件则使得调用Oracle存储过程变得简单...

    Oracle数据库的性能优化策略浅析.pdf

    本文将着重探讨如何通过对索引、表分区和优化器模式等技术的应用来优化Oracle数据库性能。 首先,索引是提高数据库查询效率的关键技术之一。在Oracle数据库中,B树索引是最为常用的一种索引类型,它能够根据键值...

    浅析Oracle数据库备份.pdf

    【Oracle数据库备份】是保障企业数据安全的关键环节。Oracle数据库作为一种广泛应用的关系型数据库,其安全性对于业务连续性和数据完整性至关重要。备份技术旨在防止因硬件故障、软件错误或恶意攻击导致的数据丢失,...

    浅析Oracle数据库安全隐患及对策.pdf

    《浅析Oracle数据库安全隐患及对策》 Oracle数据库作为一款广泛应用于各行业的关系型数据库,以其强大的稳定性和高效性赢得了用户的信赖。然而,随着技术的发展,数据库安全问题日益凸显,Oracle数据库同样面临着...

    浅析Oracle数据库的优化.pdf

    合并子查询或使用连接操作的等价形式,可以减少执行时间和资源消耗。 - **并行执行**:对于大容量数据的操作,如批量插入、更新或删除,可以启用并行执行选项,利用多核处理器提高处理速度。 - **统计信息更新**:...

    浅析PRO*C在ORACLE数据库的访问技术.pdf

    在PRO*C程序中,使用`CONNECT`语句建立与Oracle数据库的连接。连接通常需要提供用户名、密码和数据库实例信息。例如: ```c EXEC SQL CONNECT :username IDENTIFIED BY :password; ``` 5. **执行SQL语句** ...

Global site tag (gtag.js) - Google Analytics