多表之间的连接有三种方式:
Nested Loops
,
Hash Join
和
Sort Merge Join.
下面来介绍三种不同连接的不同:
一.
NESTED LOOP:
对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择
。在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查
询返回的结果集不能太大(大于
1
万不适合),要把返回子集较小表的作为外表(
CBO
默认外表是驱动表),而且在内表的连接字段上一定要有索引。当然也可以
用
ORDERED
提
示来改变
CBO
默
认的驱动表,使用
USE_NL(table_name1 table_name2)
可是强制
CBO
执
行嵌套循环连接
。
Nested loop
一般用在连接的表中有索引,并且索引选择性较好的时候
.
步骤:
确定一个驱动表
(outer table)
,另一个表为
inner table
,驱动表中的每一行与
inner
表中的相应记录
JOIN
。类似一个嵌套的循环。适用于驱动表的记录
集比较小(
<10000
)而且
inner
表需要有有效的访问方法(
Index
)
。需要注意的是:
JOIN
的顺序很重要,驱动表的记录集一定要小,返回结果集的响应时间是最快的。
cost = outer
access cost + (inner access cost * outer cardinality)
| 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
表(对
JOIN KEY
),扫描另一个表,同样对
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) + inner access cost
步骤:
将两个表排序,然后将两个表合并。通常情况下,只有在以下情况发生时,才会使用此种
JOIN
方式:
1.RBO
模式
2.
不等价关联
(>,<,>=,<=,<>)
3.HASH_JOIN_ENABLED=false
4.
数据源已排序
四. 三种连接工作方式比较:
Hash join
的工作方式
是将一个表(通常是小一点的那个表)做
hash
运算,将列数据存储到
hash
列表中,从另一个表中抽取记录,做
hash
运算,到
hash
列表中找到相应的值,做匹配。
Nested loops
工作方式
是从一张表中读取数据,访问另一张表(通常是索引)
来做匹配,
nested loops
适用的场合是当一个关联表比较小的时候,效率会更高。
Merge Join
是先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配,因为
merge join
需要做更多的排序,所以
消耗的资源更多。
通常来讲,能够使用
merge join
的地方,
hash join
都可以发挥更好的性能。
分享到:
相关推荐
如果查询涉及多个表,考虑使用连接操作符(JOIN)的优化,如选择合适的JOIN类型和使用外键约束。 工具在优化过程中也扮演着重要角色。例如,"源码"标签可能暗示了我们需要关注应用程序的代码层面。在SQL查询编写时...
Oracle多表查询是数据库操作中常见且重要的技能,特别是在处理涉及多个数据源的复杂查询时。多表查询允许用户从两个或更多个表中合并数据,以获取更全面的信息。以下将详细介绍多表查询的基本概念、操作方法以及注意...
除了查询和DML操作,Oracle还支持并行DDL(Data Definition Language)操作,如并行创建索引、并行表重建等。这些并行DDL操作可以显著减少构建大型表结构所需的时间。 ### 并行性能优化 为了最大化并行处理的性能...
在Oracle数据库系统中,多表查询是日常数据处理的关键技能,尤其对于大型企业级应用来说,数据往往分散在多个关联的表中。本篇将深入探讨Oracle中的多表查询技术,包括基本概念、联接类型、子查询以及高级查询技巧。...
- 在多表连接的情况下,选择合适的交集表可以使查询更加高效。 #### 五、其他性能优化技巧 1. **WHERE子句优化**: - 将最限制性的条件放在WHERE子句的前面,可以更早地过滤掉不匹配的记录。 2. **避免使用...
表空间是Oracle数据库中的逻辑存储结构,它由一个或多个数据文件组成。表空间可以被所有用户共享,用来存储他们的对象。每个Oracle数据库至少有一个系统表空间(SYSTEM),用于存储系统数据。 **查询表空间状态**:...
在实际应用中,理解Oracle的Hash Join代价模型和执行流程可以帮助我们优化查询性能,例如,通过调整表的分区策略、增加内存资源或利用并行执行来改善Hash Join的效率。同时,理解何时Hash Join比其他类型的JOIN(如...
在Oracle数据库中,为了获取来自多个表的数据,我们需要使用不同的连接方式来实现这一目的。本文将详细介绍三种主要的表连接方式:嵌套循环连接(Nested Loop Join,简称NL Join)、排序合并连接(Sort Merge Join,...
Oracle 的三种表连接方式是指在做表 join 的时候, Oracle 有三种方式,分别是:sort merge join(SMJ) ·nest loop(NL) ·hash join(HJ)。下面是对这三种策略的详细讲解: sort merge join(SMJ) sort merge join ...
在Oracle数据库管理系统中,查询表以及统计数据库的使用情况是一项关键任务,有助于管理员监控资源使用状况、优化性能并规划存储。本文将深入探讨如何查询Oracle表空间的使用情况,以及这个过程中的重要知识点。 ...
总的来说,优化Oracle库表设计涉及多方面因素,包括数据表达、物理存储、索引策略以及工具使用。通过深入理解业务需求、数据库原理和性能优化技巧,我们可以创建更高效、更适应业务发展的数据库结构。
Oracle 数据库中的表连接是构建复杂 SQL 查询的基础,它允许从多个表中组合数据。连接方法的选择直接影响到查询性能,因此了解各种连接类型及其适用场景至关重要。本文将深入探讨 Oracle 中的三种主要连接方式:嵌套...
Oracle大表分区是一种高效的数据管理策略,用于处理大型数据集,提高查询性能并简化数据库维护。在Oracle数据库系统中,分区技术允许将一个大表分解为较小、更易管理的部分,每个部分称为一个分区。这样做有多种好处...
当内存中构建完成哈希表后,Oracle会扫描第二个大表,将大表按需分割成多个分区,并与内存中的哈希表进行比较,匹配的记录会被加入到结果集中。最后,Oracle对结果集进行归并和汇总,生成最终结果。 **2. 内部机制*...
2. 群集连接 (CLUSTER JOIN):在早期版本的Oracle中,群集连接主要用于处理具有相同物理分布的表,但在现代版本中已被其他更高效的连接方式取代。 3. 排序合并连接(SORT MERGE JOIN):此连接要求参与连接的表都已...
在部分内容中提到了创建新的表空间以及对现有表空间进行扩展的操作,这些步骤有助于改善Oracle数据库的查询统计性能: ```sql -- 创建表空间 CREATE TABLESPACE WXGL_DATA1 DATAFILE 'WXGL_DATA1.ORA' SIZE 500M ON...
在Oracle数据库系统中,临时表空间是用于存储临时数据的特定区域,这些数据通常由排序、聚合、JOIN等操作产生。当处理大量数据或者运行复杂SQL查询时,临时表空间的作用尤为关键。然而,如果不正确地管理和使用临时...
在多表嵌套查询中,可能涉及JOIN操作,例如INNER JOIN、LEFT JOIN或RIGHT JOIN,以及子查询来获取层级关系。例如,假设我们有两张表:Department(部门)和Employee(员工),Department有父部门ID(ParentDeptID)...
通过灵活运用联接,可以处理复杂的多表查询问题。 此外,子查询(Subquery)也是Oracle查询中的重要部分。子查询可以在SELECT、FROM或WHERE子句中嵌套,用于获取满足特定条件的子集。例如,在WHERE子句中使用子查询...
优化查询通常从编写高效的SQL语句开始,包括选择合适的索引、避免全表扫描、减少子查询以及合理使用JOIN操作。在Oracle中,理解执行计划至关重要,因为它是Oracle解析和执行SQL语句的方式。通过使用EXPLAIN PLAN或...