oracle表之间的关联方式多表之间的连接有三种方式:NestedLoops,Hash Join 和 Sort Merge Join.
一. NESTED LOOP:
对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择。在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大(大于1 万不适合),要把返回子集较小表的作为外表(CBO 默认外表是驱动表),而且在内表的连接字段上一定要有索引。当然也可以用ORDERED 提示来改变CBO默认的驱动表,使用USE_NL(table_name1 table_name2)可是强制CBO 执行嵌套循环连接。
Nested loop一般用在连接的表中有索引,并且索引选择性较好的时候.
步骤:确定一个驱动表(outer table),另一个表为innertable,驱动表中的每一行与inner表中的相应记录JOIN。类似一个嵌套的循环。适用于驱动表的记录集比较小(<10000)而且inner表需要有有效的访问方法(Index)。需要注意的是:JOIN的顺序很重要,驱动表的记录集一定要小,返回结果集的响应时间是最快的。
cost = outer access cost + (inner access cost * outercardinality)
| 2 | NESTED LOOPS | | 3 | 141 | 7 (15)|
| 3 | TABLE ACCESS FULL | EMPLOYEES | 3 | 60 | 4 (25)|
| 4 | TABLE ACCESS BY INDEX ROWID| JOBS | 19 | 513 | 2 (50)|
| 5 | INDEX UNIQUE SCAN | JOB_ID_PK | 1 | | |
EMPLOYEES为outer table, JOBS为inner table.
二. HASH JOIN :
散列连接是CBO 做大数据集连接时的常用方式,优化器使用两个表中较小的表(或数据源)利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配的行。
这种方式适用于较小的表完全可以放于内存中的情况,这样总成本就是访问两个表的成本之和。但是在表很大的情况下并不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。
也可以用USE_HASH(table_name1 table_name2)提示来强制使用散列连接。如果使用散列连接HASH_AREA_SIZE 初始化参数必须足够的大,如果是9i,Oracle建议使用SQL工作区自动管理,设置WORKAREA_SIZE_POLICY 为AUTO,然后调整PGA_AGGREGATE_TARGET 即可。
Hash join在两个表的数据量差别很大的时候.
步骤:将两个表中较小的一个在内存中构造一个HASH表(对JOINKEY),扫描另一个表,同样对JOIN KEY进行HASH后探测是否可以JOIN。适用于记录集比较大的情况。需要注意的是:如果HASH表太大,无法一次构造在内存中,则分成若干个partition,写入磁盘的temporary segment,则会多一个写的代价,会降低效率。
cost = (outer access cost * # of hash partitions) + inner access cost
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 665 | 13300 | 8 (25)|
| 1 | HASH JOIN | | 665 | 13300 | 8 (25)|
| 2 | TABLE ACCESS FULL | ORDERS | 105 | 840 | 4 (25)|
| 3 | TABLE ACCESS FULL | ORDER_ITEMS | 665 | 7980 | 4 (25)|
--------------------------------------------------------------------------
ORDERS为HASH TABLE,ORDER_ITEMS扫描
三.SORT MERGE JOIN
通常情况下散列连接的效果都比排序合并连接要好,然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时排序合并连接的性能会优于散列连接。可以使用USE_MERGE(table_name1 table_name2)来强制使用排序合并连接.
Sort Merge join 用在没有索引,并且数据已经排序的情况.
cost = (outer access cost * # of hash partitions) + inneraccess cost
步骤:将两个表排序,然后将两个表合并。通常情况下,只有在以下情况发生时,才会使用此种JOIN方式:
1.RBO模式
2.不等价关联(>,<,>=,<=,<>)
3.HASH_JOIN_ENABLED=false
4.数据源已排序
四. 三种连接工作方式比较:
Hash join的工作方式是将一个表(通常是小一点的那个表)做hash运算,将列数据存储到hash列表中,从另一个表中抽取记录,做hash运算,到hash 列表中找到相应的值,做匹配。
Nested loops 工作方式是从一张表中读取数据,访问另一张表(通常是索引)来做匹配,nestedloops适用的场合是当一个关联表比较小的时候,效率会更高。
MergeJoin 是先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配,因为merge join需要做更多的排序,所以消耗的资源更多。 通常来讲,能够使用merge join的地方,hash join都可以发挥更好的性能。
摘自:http://blog.csdn.net/tianlesoftware/article/details/5826546
分享到:
相关推荐
在Oracle中,如果两个或多个表之间存在关联,比如`emp`表和`dept`表通过`deptno`字段关联,批量插入数据时需要确保关联关系的一致性。例如,插入`emp`表时,`deptno`字段应引用已存在于`dept`表中的`deptno`。可以先...
本文将通过一个具体的例子来介绍如何在Oracle中实现两表之间的关联更新,并重点讲解使用`EXISTS`嵌套子查询的方法。 #### 二、示例代码分析 以下为示例代码: ```sql UPDATE gwzjjk.zj_bankaccount a SET a....
在提供的“ORACLE 各模块核心表关联.ppt”文件中,详细列出了各个模块的关键表及其关联,包括表的用途、字段说明和相互连接的方式,为读者提供了一个直观的参考。通过深入研究这个资料,你可以更深入地理解Oracle ...
- 这种连接方式非常适合于处理大型表之间的连接,尤其是在缺乏索引或查询条件较为模糊的情况下。 - 通常情况下,散列连接比排序合并连接更快,因为它不需要对整个表进行排序。 **缺点:** - 构建散列表需要大量的...
Oracle 基础查询关联查询练习题中第一个练习题是查询职员表中,在 20 和 30 号部门工作的员工姓名和部门号。该查询使用了 IN 运算符来检索部门号在 20 和 30 之间的员工信息。 知识点:IN 运算符的使用、基础查询...
关联查询是SQL语言中的一项核心功能,它允许从两个或多个表中检索数据,基于表之间的某种关联或连接条件。在本测试题中,关联查询将用于结合`tt_student`和`tt_assess_rule`表中的信息,从而获取特定班级所有学生的...
这个查询将`EMP`表复制了一份,并以不同的别名`WORKER`和`MANAGER`表示,使得同一表的记录可以相互关联。 在实际数据库操作中,根据业务需求,灵活运用这四种连接方式可以极大地丰富查询能力,获取更复杂的数据组合...
Oracle数据库在多表关联更新中的应用研究主要集中在如何高效、准确地处理复杂的数据操作,尤其在涉及多个表之间关系的数据更新场景。在这个案例中,研究背景是一家名为仪刘鑫梓的大型百货连锁销售公司,该公司正在...
数据文件具有特定的特性,它们只能与一个数据库关联,一旦创建就只能增长,且一个或多个数据文件组成一个表空间。 在Oracle的逻辑结构中,表空间是最高级别的逻辑单位,它由一个或多个数据文件组成。表空间可以分为...
### Oracle数据库、实例、用户、表空间的关系解析 ...综上所述,Oracle数据库中的实例、用户、表空间之间存在着复杂但有序的关系。了解这些概念及其相互作用对于高效管理和维护Oracle数据库至关重要。
本话题主要关注如何使用J2EE技术与Oracle数据库进行交互,特别是针对"Dept"和"Emp"这两个表进行增删改查(CRUD)操作。 首先,Oracle数据库是全球广泛使用的数据库管理系统,尤其在企业级应用中,其稳定性和性能...
3. **多对多**:两个表之间存在多对多的关系时,通常会引入第三个表(关联表)来连接它们,该关联表中包含两个表的主键作为其外键。 #### 四、触发器的设置 触发器是一种特殊类型的存储过程,它被定义为当特定事件...
这通常涉及到两个表之间的关联操作。本文将详细介绍两种方法,用于在Oracle中实现两张表关联批量更新其中一张表的数据。 方法一(推荐): 这种方法利用了子查询和`EXISTS`子句。首先,我们在`SET`子句中创建一个子...
面对日益复杂的数据管理需求,如何高效、安全地进行数据库表的备份,并确保备份表与源表之间的关系同步,成为IT开发人员、运维人员关注的重点。 全面覆盖:从理论到实践,详细介绍Oracle数据库表备份的最佳实践,...
案例:在一个员工(emp)和部门(dept)的关联查询中,如果已知员工编号(empno=7900),Oracle 可能会选择 emp 作为驱动表,利用唯一索引 PK_EMP 快速定位该员工,然后通过部门编号(deptno)与 dept 表的唯一索引 ...
**用途:** `sysdepends` 表记录了数据库中对象之间的依赖关系,主要用于当修改或删除某个对象时,可以检查是否有其他对象依赖于它。 **字段说明:** - **`id`** (int):被依赖的对象ID。 - **`depender_id`** (int...
数据库由一系列表组成,表之间可以通过外键建立关联。 2. SCOTT用户: "SCOTT"是一个内置的Oracle示例用户,拥有几个预定义的表,如"EMP"(员工)、"DEPT"(部门)和"BONUS"(奖金)。这些表通常用于学习SQL语句和...
在多表关联中,可以创建多个TDataSource,一个对应于每个数据表,然后在它们之间建立链接。 7. **数据绑定**:Delphi的数据绑定机制使得界面上的控件可以直接显示和编辑TDataSet中的数据。在多表关联的情况下,通过...
总结来说,SSH2两表关联是在Struts2负责用户交互,Spring管理业务逻辑和依赖,Hibernate实现对象与数据库表映射的基础上,利用Oracle数据库的外键机制,实现多表间的关联查询和操作。这在Java Web开发中是常见的实践...