Informix数据库表连接操作

Informix数据库主要提供两种表连接方式。

嵌套循环连接(nested-loop join):

在嵌套循环连接中,将扫描第一个(或外部)表,以查找满足查询规则的行。对于在外部表中找到的每一行,数据库服务器将在第二个(或内部)表中搜索其相应的行。通过索引扫描还是表扫描来访问外部表则取决于内部表。如果有过滤器,数据库服务器首先会应用过滤器。如果内部表没有索引,那么数据库服务器就会将在内部表上构建索引的成本与连续扫描的成本进行比较,然后选择成本最低的那一种方法。总成本取决于连接列上是否有索引。如果连接列上有一个索引,那么其成本会相当低;否则,数据库服务器就必须对所有表(外部和内部表)执行表扫描。

哈希连接(hash join):

当一个或多个连接表上没有索引时,或者当数据库服务器必须从所有连接表中读取大量行时,就使用这种方法。在该方法中,需要扫描其中的一个表,通常扫描较小的那个表,用它在内存中创建一个哈希表。通过哈希函数,将具有相同哈希值的行放在一个Bucket 中。在扫描完第一个表并将它放在哈希表中之后,就扫描第二个表,并在哈希表中查找该表中的每一行,看是否可以进行连接。如果连接中有更多表,那么数据库服务器将对每个连接表执行相同的操作。

哈希连接包含两个动作:构建哈希(或者是我们所称的构建阶段),以及探测哈希表(或探测阶段)。
在构建阶段,数据库服务器读取一个表,通常是较小的那个表,并且在应用所有现有过滤器之后,在内存中创建一个哈希表。可以在概念上将哈希表认为是一系列的 Bucket,每个 Bucket 所拥有的地址是通过应用哈希函数从键值导出的。
在探测阶段,数据库服务器将读取连接中的其他表,如果存在过滤器,就应用过滤器。在满足过滤器条件的每个行中,数据库服务器将对键应用哈希函数,并探测哈希表以查找匹配的键值。如果读取的相关数据包含在索引节点中,数据库服务器就只需读取索引,不需要再去读取相应的数据页。

标签: none

添加新评论