您的位置:首页 > 其它

表连接方式概念以及在执行计划中执行步骤[摘]

2011-07-26 22:11 225 查看
嵌套循环连接(Nested Loops Join) 嵌套循环连接的最核心特征就是最先被执行的表的查询范围决定着整体的数据处理量,后来反复执行的连接操作按照随机方式在执行。在嵌套循环连接时,当表中的数据量比较少时比较有效;而当表中的数据量比较大时不仅效率较低,而且所需的代价也比较大。因此,在对数据量比较大的表执行连接时应该尝试其他连接方式。
嵌套循环连接的具体执行步骤:
1.优化器决定优先被执行的外侧表。这个外侧表也被称为驱动表,以驱动表查询范围中的每一行数据为基准从内侧表中寻找满足查询条件的数据行。
2.在从驱动表中读取满足某些查询条件的数据行之后,SQL语句中所使用到的关于该驱动表的所有列都将获得常量,通过对这些常量和原来就赋予了常量的查询条件的斟酌,为下一步执行选择一个内侧表。
3.如果仍然还存在需要按照该方法执行连接的表,则按照与上面相同的方法来决定连接顺序。如果连接列上有索引,则会对优化器决定连接顺序有重要影响。
4.实际在连接时,需要读取与外侧集合中的每一行数据相对应的内侧集合中的所有行。如果可以通过部分范围处理的方式来处理,则在执行过程中可以临时中止连接。对于外侧循环中的每一个数据行,内侧循环中所有满足条件的数据行都需要被执行。

排序合并连接(Sort Merge Join)
主要是为了弥补嵌套循环连接的不足,即在连接数据量比较大时,为了缩减嵌套循环中的大量随机读取,以及连接列不存在索引时,可以替代嵌套循环连接。
排序合并连接的最大特征是在扫描的同时执行连接,而不是像嵌套循环连接那样为了执行表连接而需要按随机方式读取数据。为了实现表连接,必须先对两个表中将要执行连接的行进行排序。虽然提高了连接的效率,但由于排序的存在,所以也增加了连接的代价。
在连接条件中主要使用的是LIKE、BETWEEN、>、>=、<、<=而不是“=”比较运算符的情况下,该方式比嵌套循环有效。若使用非“=”比较运算符,则哈希连接无法被使用。

哈希连接(Hash Join)
哈希连接是指通过使用哈希函数的方法来实现表连接的方式。所谓函数,是指为其提供一个变量值再通过函数运算返回一个值的过程。哈希函数是指提供必要列值再通过哈希函数运算返回行的存储位置的过程,在哈希聚簇中使用的就是哈希函数。
将具有相同哈希值的数据行集中存储在相同的空间中,该空间被称为分区(Partition),在这些分区中必须要进行连接的两个分区称为分区对。实际上,哈希连接是以分区对为对象来执行连接操作的。在连接时,将较小分区中的数据行读入到内存中并为其创建临时哈希表,然后将哈希表中的行视为内侧循环,较大分区中的行视为外侧循环来执行哈希连接。
因为哈希连接使用的是哈希的概念,所以在连接条件中也存在着限制条件,即只有在使用了“=”比较运算符的情况下才可以按照哈希连接方式实现连接。哈希连接的最大优点就是在连接海量数据表或表中的数据存储比较分散时比较有效。

半连接(Semi Join)
由各种运算符所构成的子查询与主查询之间的连接。尽管子查询的种类有很多,但其都是一种为实现子查询之间连接的表连接。

笛卡尔连接
笛卡尔连接是指两表连接没有任何连接条件的情况。这里的“没有连接条件”并不是指连一般的查询条件都没有,连接条件与查询条件之间并没有什么本质联系。从广义概念上看,笛卡尔连接是M:N的连接。虽然在执行计划中以“CARTESIAN”来表示笛卡尔连接,但实际上它是按照排序合并方式执行的。
在SQL语句没有错误的前提下,按照该方式进行表连接的情况有两种:第一,用户为了实现特殊的目的而特意使用笛卡尔连接;第二,在连接三个以上的表时由于连接顺序设计上的失误而使得连接条件无法成立。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: