您的位置 首页 动态

浅谈Oracle中的三种Join办法

浅谈Oracle中的三种Join方法Hash join的主要资源消耗在于CPU(在内存中创建临时的hash表,并进行hash计算),而merge join的资源消耗主要在于磁盘I/O(扫描表或索引)。

基本概念

Nested loop join:

Outer table中的每一行与inner table中的相应记载join,相似一个嵌套的循环。

Sort merge join:

将两个表排序,然后再进行join。

Hash join:

将两个表中较小的一个在内存中结构一个Hash 表(对Join Key),扫描另一个表,相同对Join Key进行Hash后勘探是否能够join,找出与之匹配的行。

一张小表被hash在内存中。由于数据量小,所以这张小表的大多数数据现已驻入在内存中,剩余的少数数据被放置在暂时表空间中;

每读取大表的一条记载,就和小表中内存中的数据进行比较,假如契合,则当即输出数据(也就是说没有读取暂时表空间中的小表的数据)。而假如大表的数据与小表中暂时表空间的数据相契合,则不直接输出,而是也被存储暂时表空间中。

当大表的一切数据都读取结束,将暂时表空间中的数据以其输出。假如小表的数据量满足小(小于hash area size),那一切数据就都在内存中了,能够防止对暂时表空间的读写。

假如是并行环境下,前面中的第2步就变成如下了:每读取一条大表的记载,和内存中小表的数据比较,假如契合先做join,而不直接输出,直到整张大表数据读取结束。假如内存满足,Join好的数据就保存在内存中。不然,就保存在暂时表空间中。

适用范围

Nested loop join:

适用于outer table(有的当地叫Master table)的记载集比较少(10000)并且inner table(有的当地叫Detail table)索引选择性较好的情况下(inner table要有index)。

inner table被outer table驱动,outer table回来的每一行都要在inner table中检索到与之匹配的行。当然也能够用ORDERED 提示来改动CBO默许的驱动表,运用USE_NL(table_name1 table_name2)可是强制CBO 履行嵌套循环衔接。

cost = outer access cost + (inner access cost * outer cardinality)

Sort merge join:

用在数据没有索引可是现已排序的情况下。

通常情况下hash join的作用都比Sort merge join要好,但是假如行源现已被排过序,在履行排序兼并衔接时不需求再排序了,这时Sort merge join的功能会优于hash join。能够运用USE_MERGE(table_name1 table_name2)来强制运用Sort merge join。
cost = (outer access cost * # of hash partitions) + inner access cost

Hash join:

适用于两个表的数据量不同很大。但需求留意的是:假如HASH表太大,无法一次结构在内存中,则分红若干个partition,写入磁盘的temporary segment,则会多一个I/O的价值,会下降功率,此刻需求有较大的temporary segment然后尽量进步I/O的功能。

能够用USE_HASH(table_name1 table_name2)提示来强制运用散列衔接。假如运用散列连HASH_AREA_SIZE 初始化参数有必要满足的大,假如是9i,Oracle主张运用SQL作业区主动办理,设置WORKAREA_SIZE_POLICY 为AUTO,然后调整PGA_AGGREGATE_TARGET 即可。

也能够运用HASH_JOIN_ENABLED=FALSE(默许为TRUE)强制不运用hash join。

cost = (outer access cost * # of hash partitions) + inner access cost

功率比较

Hash join的首要资源耗费在于CPU(在内存中创立暂时的hash表,并进行hash核算),而merge join的资源耗费首要在于磁盘I/O(扫描表或索引)。在并行体系中,hash join对CPU的耗费愈加显着。所以在CPU严重时,最好约束运用hash join。

在绝大多数情况下,hash join功率比其他join方法功率更高:

在Sort-Merge Join(SMJ),两张表的数据都需求先做排序,然后做merge。因而功率相对最差;

Nested-Loop Join(NL)功率比SMJ更高。特别是当驱动表的数据量很大(集的势高)时。这样能够并行扫描内表。

Hash join功率最高,由于只要对两张表扫描一次。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/187575.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部