NESTED LOOP
对于被连接的数据子集较小的情况,nested loop连接是个较好的选择。nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查找,没有索引一般就不会是 nested loops。
一般在nested loop中, 驱动表满足条件结果集不大,被驱动表的连接字段要有索引,这样就走nstedloop。如果驱动表返回记录太多,就不适合nested loops了。如果连接字段没有索引,则适合走hash join,因为不需要索引。
可用ordered提示来改变CBO默认的驱动表,可用USE_NL(table_name1 table_name2)提示来强制使用nested loop。
HASH JOIN
hash join是CBO 做大数据集连接时的常用方式。优化器扫描小表(或数据源),利用连接键(也就是根据连接字段计算hash 值)在内存中建立hash表,然后扫描大表,每读到一条记录就来探测hash表一次,找出与hash表匹配的行。
当小表可以全部放入内存中,其成本接近全表扫描两个表的成本之和。如果表很大不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部 分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。临时段中的分区都需要换进内存做hash join。这时候成本接近于全表扫描小表+分区数*全表扫描大表的代价和。
至于两个表都进行分区,其好处是可以使用parallel query,就是多个进程同时对不同的分区进行join,然后再合并。但是复杂。
使用hash join时,HASH_AREA_SIZE初始化参数必须足够的大,如果是9i,Oracle建议使用SQL工作区自动管理,设置WORKAREA_SIZE_POLICY 为AUTO,然后调整PGA_AGGREGATE_TARGET即可。
以下条件下hash join可能有优势:
两个巨大的表之间的连接。
在一个巨大的表和一个小表之间的连接。
可用ordered提示来改变CBO默认的驱动表,可用USE_HASH(table_name1 table_name2)提示来强制使用hash join。
SORT MERGE JOIN
sort merge join的操作通常分三步:对连接的每个表做table access full;对table access full的结果进行排序;进行merge join对排序结果进行合并。sort merge join性能开销几乎都在前两步。一般是在没有索引的情况下,9i开始已经很少出现了,因为其排序成本高,大多为hash join替代了。
通常情况下hash join的效果都比sort merge join要好,然而如果行源已经被排过序,在执行sort merge join时不需要再排序了,这时sort merge join的性能会优于hash join。
在全表扫描比索引范围扫描再通过rowid进行表访问更可取的情况下,sort merge join会比nested loops性能更佳。
可用USE_MERGE(table_name1 table_name2)提示强制使用sort merge join。
nested loop join 一般适和大小表,且大表有index,全表scan小表,然后按index抽取大表匹配记录,返会第一条记录快。
merger join 要对两表排序,然后匹配,要等所有记录处理完后,才能返回结果。
hash join 要对一表计算hash值,然后对另一表联接自段算hash,找到匹配记录。
相关推荐
Oracle 的三种表连接方式是指在做表 join 的时候, Oracle 有三种方式,分别是:sort merge join(SMJ) ·nest loop(NL) ·hash join(HJ)。下面是对这三种策略的详细讲解: sort merge join(SMJ) sort merge join ...
本文档主要讨论 Oracle 面试中的基础概念和执行计划,包括表连接方式、等连接、非等连接、自连接、外连接、hash join、merge join、nest loop、index join 等,并对各种连接方式进行了详细的解释和示例。 一、基础...
hash join/merge join/nest loop(cluster join)/index join 2:不借助第三方工具,怎样查看sql的执行计划 set autot on explain plan set statement_id = &item_id for &sql; select * from table(dbms...
- **Hash Join / Merge Join / Nest Loop (Cluster Join) / Index Join**:这些是不同的物理连接方法,Oracle会根据具体情况选择最合适的连接算法。 - **Hash Join**:适用于大型表之间的连接,通过创建哈希表来...
Oracle 8i和9i还提供了hash join、merge join、nest loop(cluster join)和index join等连接算法。 本文档总结了多种表连接方式,包括等连接、非等连接、自连接、外连接等,并对每种连接方式进行了详细的说明和...
在 Oracle 中,表连接方式有多种,包括 Hash Join、Merge Join、Nest Loop(Cluster Join)和 Index Join。每种连接方式都有其特点和应用场景,了解这些连接方式可以帮助 DBA 选择合适的连接方式来提高查询性能。 ...
在 Oracle 中,存在多种表连接方式,如 Hash Join、Merge Join、Nest Loop Join、Index Join 等。选择合适的连接方式可以大大提高查询性能。 四、使用 CBO 优化器 CBO(Cost-Based Optimizer)是 Oracle 中的一种...
1. **表连接方式**:Oracle支持多种表连接方式,包括哈希连接(Hash Join)、合并连接(Merge Join)、嵌套循环连接(Nest Loop,也称为Cluster Join)和索引连接(Index Join)。每种连接方式都有其适用场景,比如...
1. **表连接方式**:Oracle支持多种连接方式,如哈希连接(Hash Join)、合并连接(Merge Join)、嵌套循环连接(Nest Loop,也称为Cluster Join)和索引连接(Index Join)。哈希连接通过创建哈希表来匹配数据;...
1. Nest-Loop:嵌套循环连接,适用于小表连接大表的情况。 2. Merge Join:归并连接,利用排序后的数据进行连接,适合已排序的输入。 3. Hash Join:哈希连接,通过创建哈希表来快速匹配行,适用于内存充足的情况...
hash join/merge join/nest loop(cluster join)/index join 2:不借助第三方工具,怎样查看sql的执行计划 set autot on explain plan set statement_id = &item_id for &sql; select * from table(dbms_...
1. 列举几种表连接方式:hash join、merge join、nest loop(cluster join)、index join等。 2. 不借助第三方工具,怎样查看 sql 的执行计划:使用set autot on和explain plan set statement_id = &item_id for &sql;...
在Oracle数据库中,常见的JOIN类型包括hash join、merge join、nest loop join(又称为cluster join)、index join等。举例来说,以下是一个使用hash join的SQL语句: ```sql SELECT * FROM a, b WHERE a.id = b.id...
1. 表连接方式:hash join、merge join、nest loop(cluster join)、index join等。 2. 查看SQL执行计划:使用set autot on,explain plan set statement_id = &item_id for &sql;,select * from table(dbms_...
在Oracle数据库中,表连接是实现多个表之间数据关联的重要手段。常见的表连接方式包括: 1. **Hash Join**:当两个表进行连接时,Oracle会通过创建一个散列表来加速连接操作。这种方式特别适用于大数据量的连接操作...
在Oracle数据库中,表连接是实现多个表之间数据关联的重要手段。常见的表连接方式包括: 1. **Hash Join**:当两个表进行连接时,Oracle会通过创建一个散列表来加速连接过程。这种方式特别适用于大数据量的连接操作...
1. **表连接方式**:SQL中的表连接主要有四种类型:哈希连接(Hash Join)、归并连接(Merge Join)、嵌套循环连接(Nest Loop,也称为Cluster Join)和索引连接(Index Join)。每种连接方式都有其适用场景,DBA...
表连接方式** - **Hash Join**: 基于哈希算法的一种连接方式,适用于大表之间的连接,尤其是在连接表大小未知的情况下非常有效。 - **Merge Join**: 也称为排序合并连接,这种连接方式要求两个表都要先进行排序,...