admin 管理员组

文章数量: 887021


2024年1月16日发(作者:日期格式正则表达式)

DB2 JOIN方式探讨

摘 要 在DB2数据库查询语句中,当需要对多个表进行Join时,有不同的连接方式可以选择,常用的有嵌套循环连接、合并连接和混合连接。本文介绍了这些连接的工作原理,并结合实例进行说明,最后给出了DB2优化器在选择不同连接方式时的判断条件。

关键词 DB2;嵌套循环连接;合并连接;混合连接

1 概述

当我们在 SQL 里面需要对多个表进行join的时候,DB2 会首先选择其中的 2 个表进行join,并获取到一个中间的结果集,然后 DB2 可能会用这个中间的结果集和第三个表做 join,再次获得中间的结果集。因此当优化器在考虑join如何处理的时候,join的顺序就是一个很重要的问题,因为我们总是希望能够在最开始就把结果集控制的尽量小。接下来我们就介绍不同的连接方法以及分别在何种情况下适用。

2 连接方式

两个表之间的连接是这样操作的:将一个表中的行与另一个表中的行并置在一起。另外,可以指定条件以定义并置哪些行。为执行这一操作,DB2 可以选择不同的连接方法,无论使用哪种连接方法,总有一个表被选为外表(outer table)而另一个表被选为内表(inner table)。优化器根据所选连接方法的成本和类型决定哪个是外表、哪个是内表。首先访问外表,并且只扫描一次。根据连接的类型和存在的索引,可以多次扫描内表。还有一点也很重要,要记住即使您试图连接两个以上的表,优化器也将每次只连接两个表,并在必要时保存中间结果。

DB2 for z/OS有3种join的方式,分别是:嵌套循环连接(Nested Loop Join),合并连接(Sort Merge Join),混合连接 (Hybrid Join),不同的join方式在不同的情况下能够对性能产生不同的影响,下面,我们将分别介绍每种连接方式其适用场合。

2.1 嵌套循环连接(Nested Loop Join)

对于嵌套循环连接,外表只被扫描一次,要在内表中找到与外表中每一行相匹配的行有两种方法:一是扫描内表。即,读取内表中的每一行,并且针对该行决定是否应将其与正在考虑的外表中的行相连接。二是对内表上的连接列进行索引查找。当用于连接的谓词所包含的列在内表的索引中时,这种方法是可行的。这极大地减少了在内表中访问的行数。

在图1中,对于外表的A2,连接值2用来与内表匹配,查看内表的索引并找到内表的2X。如果没有索引,那么内表将从第一行开始扫描到最后一行去匹

配2,找到2X与A2匹配,将A2X放进结果表中。

然后外表的指针移到B4,再次扫面内表,发现4W与之匹配,将B4W放进结果表中。

指针接着向下移动到C1,发现内表有两行1U和1Y与之拼配,将其合并成两条记录C1U和C1Y放进结果表中。

指针依次向下移动,最后指到E7,发现内表中没有与之匹配的行。这是外表的最后一行,所以这次合并过程结束。

嵌套循环连接中,决定哪个是外表,哪个是内表非常重要,因为外表只扫描一次,而针对外表中的每一行,都要访问一次内表。优化器在做谁是外表谁是内表的决定时会考虑几个因素:表的大小,缓冲,谓词,排序要求,是否存在索引。DB2优化器在下述情况下采用嵌套循环连接:

1)外表非常小;

2)外表的FF非常小,使得过滤后的外表非常小;

3)内表中拥有有效的高聚合的索引;

4)内表中访问的数据页非常小。

2.2 合并连接(Sort Merge Join)

合并连接同时扫描两个表,以查找匹配行,并需要一个等式连接谓词(即具有 = 格式的谓词)。它还要求根据连接列对输入表进行排序,通过扫描现有索引或在进行连接之前对表进行排序就可以做到这一点。

在图2中,外表和内表都按照连接列进行排序,外表的第一行A1的连接值为1,内表的第一行1U与之匹配,结果表中生成了第一行A1U,内表中会产生连接值为1的组1。内表的指针下移到2V,它的连接值2与1不同,这时内表中会产生连接值为2的组2。

接着外表指针移到B2,连接值为2,这时内表将跳过组1,在组2中找到2V与之匹配,生成B2V放入结果表。内表的指针下移到2W,连接值仍为2,将其放进组2中,生成B2W放入结果表。内表指针再次下移到3X,连接值为3,不属于组2,这时内表会产生连接值为3的组3。

接着外表指针移到C2,连接值为2,这时内表将组2中的成员全部与之匹配,生成C2V,C2W放入结果表中。

接着外表指针移到D4,连接值为4,比组3的连接值大,内表将继续向下

扫描,发现没有与之匹配的行。

接着外表指针移到E5,连接值为5,比组3的连接值大,内表将继续向下扫描,找到5Y与之匹配,生成E5Y放入结果表,内表产生连接值为5的组5,接着内表指针移到5Z,生成E5Z放入结果表,这是内表的最后一行。

接着外表指针移到F6,连接值为6,但内表的最后一行连接值为5,没有与之匹配的,外表指针移到最后,合并过程结束。

因为表通常只被扫描一次,所以决定哪个是外表、哪个是内表不像在其它连接方法中那么重要。尽管如此,由于可能有重复的值,所以优化器通常选择重复值较少的表作为外表。一般来说,DB2优化器在如下情况下采用合并连接:

1)满足条件的外表和内表都非常大,并且在matching的predicate上没有索引;

2)在select中来自内表的列非常小。

2.3 混合连接(Hybrid Join):

混合连接的前提条件是在内表的join列上必须建有index,其工作原理是将嵌套循环连接和合并连接结合起来使用。这种连接只适用于内表,而另外两种连接内外表都适用。这种方式在中型表的连接过程中会起到提升性能的作用,但在大多数时候很少有访问路径使用这种类型的连接。这里我们只介绍一下混合连接的适用场合,DB2优化器在下述情况下采用混合连接:

1)内表的join列上的索引是非聚集索引或者非聚集索引集;

2)过滤后的外表有重复的记录值。

到目前为止,我们已经讨论了DB2在join时的不同连接方式。正如我们所知,初看起来,某些方法与其它方法相比是更好的选择。例如,与根据外表的每一行扫描内表的嵌套循环连接相比,合并连接具有只对表扫描一次的优势。于是,合并连接似乎是一个更好的选择;但是,如果存在索引的话,则嵌套循环会是更好的选择。

参考文献

[1]王飞鹏,等.DB2设计与性能优化——原理、方法与实践[M].电子工业出版社,2011.

[2]牛新庄.DB2数据库性能调整和优化[M].清华大学出版社,2009.


本文标签: 连接 内表 外表 合并 结果