基于哈希连接的探测方法、装置、设备及存储介质与流程

文档序号:24984985发布日期:2021-05-07 23:02阅读:114来源:国知局
基于哈希连接的探测方法、装置、设备及存储介质与流程

本申请实施例涉及关系型数据库领域,尤其涉及一种基于哈希连接的探测方法、装置、设备及存储介质。



背景技术:

连接操作是数据库中的基本操作,用于从两个关系的笛卡尔积中选取属性之间满足一定条件的元组,现有的连接技术有很多,比如,嵌套循环连接算法、基于归并排序的连接算法、基于哈希的连接算法、基于索引的连接算法等,不同的算法在不同应用场景下有不同的性能。当两个表做连接查询,且有等值连接条件时,哈希连接是实现两个表连接的一种高效的实现方式。例如,通过select*fromt1,t2wheret1.c1=t2.d2;语句查询哈希连接,可以选用数据较少的表作为左表,比如,t1作为左表,有c1和c2两个列,t2作为右表,有d1和d2两个列。t1表的数据如下:

表1

基于t1构造哈希表,采用t2表进行探测,输出满足条件(t1.c1=t2.d2)的结果。其中,构造哈希表的过程如下:

1、根据配置参数创建一张固定大小的哈希表;

2、使用数据库内部函数(比如bfd_int64、bfd_dec、bfd_time等)将t1.c1的实际值value计算得到哈希键值key;

3、通过哈希函数计算键值key在哈希表中的位置,并在该位置插入对应的实际值value;

4、循环执行步骤2、3,直至处理完t1表中的数据。

但是,若多个哈希键值映射到哈希表中相同的位置,则会成为哈希冲突,具体包括以下三种情况:

第一种,相同的原始值。即计算得到相同的哈希键值key,通过哈希函数映射到哈希表同一个位置;第二种,不同的原始值。通过多个值组合、字符串等类型计算得到相同的哈希键值key,通过哈希函数映射到哈希表的同一个位置;第三种,原始值和哈希键值key均不同。当原始值个数超过哈希表大小,有些不同的哈希键值会映射到哈希表同一个位置,或者哈希算法也会决定哈希冲突的概率。

基于上述哈希冲突的原因,哈希探测时需要比较原始数据,该过程如下:

(1)获取哈希连接中右表连接的原始数据(例如t2.d2),计算哈希键值并通过哈希函数定位到哈希表的具体位置(即哈希槽);

(2)将连接列的原始数据(如t2.d2)和哈希槽上的数据进行一一比较,如果相等,说明该行数据符合要求,并输出查询项的数据(例如,以上述查询语句为例,设t2此时的数据为(1,4),匹配到t1(1,2),那么输出查询结果为(1,2,1,4))。

(3)重复上述步骤(1)、(2),直至右表中的数据处理完毕。

可以看出,上述哈希探测过程中存在以下问题:1、右表数据需要与定位到的哈希槽上每条数据进行比较;2、相同的数据存在重复比较;3、哈希表不存在冲突,并且右表数据为左表数据的子集时,工业应用上通常仍然需要一一比较原始数据。



技术实现要素:

为了解决上述至少一个技术问题,本申请实施例提供了以下方案。

第一方面,本申请实施例提供了一种基于哈希连接的探测方法,该方法包括:

创建第一表格的哈希表,哈希表包括哈希槽;

确定第一表格中各参考列数据在哈希表中对应的哈希槽;

根据各参考列数据的哈希槽是否冲突选择相应的存储方式依次将各参考列数据所属的整行数据存储至对应的哈希槽,并根据存储结果设置各哈希槽的冲突标记;

根据冲突标记和第二表格中的数据进行哈希探测,第二表格与第一表格哈希连接。

第二方面,本申请实施例还提供了一种基于哈希连接的探测装置,该装置包括:

创建模块,用于创建第一表格的哈希表,哈希表包括哈希槽;

确定模块,用于确定第一表格中各参考列数据在哈希表中对应的哈希槽;

存储模块,用于根据各参考列数据的哈希槽是否冲突选择相应的存储方式依次将各参考列数据所属的整行数据存储至对应的哈希槽,并根据存储结果设置各哈希槽的冲突标记;

探测模块,用于根据冲突标记和第二表格中的数据进行哈希探测,第二表格与第一表格哈希连接。

第三方面,本申请实施例还提供了一种电子设备,包括:存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,当处理器执行计算机程序时,实现如本申请任意实施例提供的基于哈希连接的探测方法。

第四方面,本申请实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时,实现如本申请任意实施例提供的基于哈希连接的探测方法。

本申请实施例提供一种基于哈希连接的探测方法、装置、设备及存储介质,具体包括创建第一表格的哈希表,哈希表包括哈希槽;确定第一表格中各参考列数据在哈希表中对应的哈希槽;根据各参考列数据的哈希槽是否冲突选择相应的存储方式依次将各参考列数据所属的整行数据存储至对应的哈希槽,并根据存储结果设置各哈希槽的冲突标记;根据冲突标记和第二表格中的数据进行哈希探测,第二表格与第一表格哈希连接。在本方案中,根据哈希槽冲突与否选择不同的存储方式存储数据,并基于冲突标记进行哈希探测,可以解决现有技术中哈希连接存在的问题,提高哈希连接的性能。

附图说明

图1为本申请实施例中的一种基于哈希连接的探测方法流程图;

图2是本申请实施例中的创建的哈希表的示意图;

图3是本申请实施例中的哈希节点存储数据的示意图;

图4是本申请实施例中的基于哈希连接的探测装置结构示意图;

图5是本申请实施例中的电子设备的结构示意图。

具体实施方式

下面结合附图和实施例对本申请作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本申请,而非对本申请的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本申请相关的部分而非全部结构。

另外,在本申请实施例中,“可选地”或者“示例性地”等词用于表示作例子、例证或说明。本申请实施例中被描述为“可选地”或者“示例性地”的任何实施例或设计方案不应被解释为比其它实施例或设计方案更优选或更具优势。确切而言,使用“可选地”或者“示例性地”等词旨在以具体方式呈现相关概念。

本申请实施例可以应用于现有关系型数据库中,在使用左表连接列数据(例如,上述示例中的t1.c1)建立哈希表且插入数据,并根据右表数据匹配哈希表数据时,能够实现针对现有技术中不同的冲突问题进行优化处理。

图1为本申请实施例提供的一种基于哈希连接的探测方法,如图1所示,该方法可以包括但不限于以下步骤:

s101、创建第一表格的哈希表。

本步骤中创建哈希表时,可以根据用户自定义的参数大小、第一表格的实际数据量,或者也可以根据实际内存大小,创建相应大小的哈希表。可选地,在创建第一表格的哈希表时,可以设置冲突标记conflic_flag和哈希槽中哈希节点的list链表,该链表设置于哈希节点的结构体中。

在执行本申请实施例时,可以先通过结构化查询语言(structuredquerylanguage,sql)生成执行计划阶段,生成的执行计划阶段可以包含扫描、投影、筛选等操作,也可以包含数据表格之间的哈希连接、嵌套连接、排序连接等。

其中,对于哈希连接可以设置判断标记is_subset,该标记用于标识第二表格是否为第一表格的子集,例如,在第一表格与第二表格满足以下任意一个条件时,可以设置判断标记is_subset标识第二表格为第一表格的子集,例如:

一、第二表格的连接列为第一表格连接列的外键,并且连接列数据没有经过转换;

二、第一表格和第二表格来自相同的对象(比如,同一个表、同一个视图、同一个表达式等),并且第二表格为第一表格的子集。

上述的第二表格为与第一表格哈希连接的表格。需要说明的是,在本申请实施例中,可以存在多个哈希连接。在sql执行阶段,若判断存在哈希连接,那么可以根据相关设置参数创建大小固定的哈希表,如图2所示,创建的哈希表包括哈希槽。

s102、确定第一表格中各参考列数据在哈希表中对应的哈希槽。

本步骤中的参考列数据可以理解为查询语句(例如,select*fromt1,t2wheret1.c1=t2.d2;)中设置的列对应的数据。比如,将表t1作为第一表格,那么查询语句中的表t1的c1列所包含的数据即为本步骤中的参考列数据,进而可以基于该参考列数据确定各数据在创建的哈希表中各自对应的哈希槽。

示例性地,假设t1.c1的类型为整型,t1.c1的实际值value和经过计算得到哈希键值相同,选用哈希函数为n%10,n为哈希键值,那么可以计算得到各参考类数据对应的哈希槽号,也即哈希表中的位置。

s103、根据各参考列数据的哈希槽是否冲突选择相应的存储方式依次将各参考列数据所属的整行数据存储至对应的哈希槽,并根据存储结果设置各哈希槽的冲突标记,该冲突标记可以用于表示哈希槽是否为冲突的哈希槽。

基于哈希函数计算各参考列数据的哈希槽时,可能会出现哈希槽冲突,即不同参考列数据对应的哈希槽号相同的情况。例如,将t1表c1列中的数据作为参考列数据,选用哈希函数n%10,那么基于该函数计算各参考列数据对应的哈希槽号时,数据1、11、21均对应哈希槽号为1的哈希槽,即这三个数据的哈希槽存在冲突。同样地,计算数据77、99对应的哈希槽号时,确定77对应的哈希槽号为7,99对应的哈希槽号为9,说明这两个数据的哈希槽不存在冲突。那么针对这两种不同的情况,分别采用不同的存储方式将各参考列数据所属的整行数据存储至对应的哈希槽。即根据t1.c1列的数据计算得到哈希槽号,在对应哈希槽中存储数据时,存储t1.c1和t1.c2列的数据。

相应地,在针对哈希槽号计算结果存储数据时,也可以设置各哈希槽的冲突标记conflic_flag,该标记可以用于指示该哈希槽是否为冲突的哈希槽。例如,conflic_flag值为1,表示该哈希槽为冲突的哈希槽,conflic_flag值为0,表示该哈希槽不为冲突的哈希槽。

通过设置冲突标记和哈希节点的链表的方式,可以实现针对不同的情况,对数据进行分类存储。

s104、根据冲突标记和第二表格中的数据进行哈希探测。

示例性地,可以采用如下方式基于第二表格中的数据进行哈希探测,例如:

步骤一:确定第二表格中当前匹配列数据的哈希槽。

与第一表格一样,先计算当前匹配列数据(比如,d2列的数据)的键值,再基于哈希函数对键值进行计算得到当前匹配列数据对应的槽号,从而确定当前匹配列数据的哈希槽。

步骤二:在第二表格为第一表格的子集的情况下,根据冲突标记和当前数据的哈希槽进行哈希探测。

即在判断标记is_subset标识第二表格为第一表格的子集的情况下,根据冲突标记和当前数据的哈希槽进行哈希探测。

步骤三:获取第二表格中的下一个匹配列数据,并将下一个匹配列数据确定为当前匹配列数据。

重复上述步骤一至步骤三,直至对第二表格中的所有匹配列数据都执行完哈希探测。

即基于上述循环的方式确定第二表格中所有匹配列数据的哈希槽,并基于哈希槽和冲突标记,对每个匹配列数据执行哈希探测。

本申请实施例提供了一种基于哈希连接的探测方法,该方法包括创建第一表格的哈希表,哈希表包括哈希槽;确定第一表格中各参考列数据在哈希表中对应的哈希槽;根据各参考列数据的哈希槽是否冲突选择相应的存储方式依次将各参考列数据所属的整行数据存储至对应的哈希槽,并根据存储结果设置各哈希槽的冲突标记;根据冲突标记和第二表格中的数据进行哈希探测,第二表格与第一表格哈希连接。在本方案中,根据哈希槽冲突与否选择不同的存储方式存储数据,并基于冲突标记进行哈希探测,可以解决现有技术中哈希连接存在的问题,提高哈希连接的性能。

在一种示例中,上述步骤s103中的实现方式可以包括以下两种情况:

第一种,若不存在冲突,则将第一表格中当前参考列数据所属的整行数据存储于对应哈希槽的哈希节点的链表中。

不存在冲突说明当前参考列数据的哈希槽为空,那么可以将该参考列数据所属的整行数据都存储于对应哈希槽的哈希节点的链表中。

第二种,若存在冲突,则根据第一表格中当前参考列数据与冲突的哈希槽的哈希节点中已存储的参考列数据是否相同选择对应的存储方式,将当前参考列数据所属的整行数据存储至对应哈希节点的链表中。

存在冲突,说明当前参考列数据的哈希槽与之前已经存储的参考列数据的哈希槽相同,例如,参考列数据1、21对应的哈希槽相同,整行数据(5,7)和(5,8)中参考列数据对应的哈希槽也相同,那么就需要进一步区分当前参考列数据与已经存储的参考列数据是否相同,并根据不同的判断情况选择对应的存储方式,将当前参考列数据所属的整行数据存储至对应哈希节点的链表。

例如,若当前参考列数据与已存储的参考列数据相同,则将当前参考列数据所属的整行数据存储至已存储的参考列数据所属的哈希节点的链表中。比如,哈希槽号为5的哈希槽中哈希节点的链表存储了整行数据(5,7),当前整行数据为(5,9),当前参考列数据为5,与已存储的整行数据中参考列数据相同,那么可以将当前的整行数据(5,9)存储至已存储的整行数据(5,7)所属的哈希节点的链表中,如图3所示。

需要说明的是,在同一个哈希节点中存储整行数据时,不要求顺序存储,即若t1表格中存在整行数据(5,5),那么后续在上述同一个哈希节点中存储该整行数据时,可以直接将该数据存储于整行数据(5,9)之后。

相反,若当前参考列数据与已存储的参考列数据不相同,则以顺序存储的方式将当前参考列数据所属的整行数据存储至冲突的哈希槽的其他哈希节点的链表中。如图3所示,若当前参考列数据为21,其与已存储的整行数据(1,2)的参考列数据对应的哈希槽相同,但这两个参考列数据不同,那么可以按照顺序存储(比如,升序或者降序)的方式将该当前参考列数据21所属的整行数据(21,3)存储于该哈希槽链表中其他哈希节点的链表中。

在一种示例中,上述步骤s104中进行哈希探测时,若冲突标记表示第二表格中当前匹配列数据对应的哈希槽为不冲突的哈希槽,那么说明该哈希槽为空,没有存储第一表格中的数据,或者仅有一个哈希节点存储了第一表格中的整行数据,那么在哈希槽为空的情况下,丢弃该第二表格中当前匹配列数据所属的整行数据;或者,在哈希槽不为空的情况下,表示哈希探测匹配成功,那么可以输出该哈希槽的哈希节点存储的整行数据和当前匹配列数据所属的第二表格中的整行数据。

例如,假设第二表格的匹配列为t2.d2,当前匹配列所属的整行数据为(5,10),哈希槽号为5的哈希槽的哈希节点存储的整行数据包括(5,7)、(5,8)、(5,9),这几个整行数据存储于同一个哈希节点的链表上,那么最终输出的数据为(5,7,5,10)、(5,8,5,10)、(5,9,5,10)。

相反,若冲突标记表示哈希槽为冲突的哈希槽,即说明哈希槽中有多个哈希节点的链表中存储有第一表格中的数据,那么可以将第二表格当前匹配列数据与哈希槽中各哈希节点存储的参考列数据依次进行比较,若当前匹配列数据与哈希槽当前哈希节点存储的参考列数据相等,说明第二表格中当前匹配列数据哈希探测匹配成功,则输出参考列数据所属的整行数据和当前匹配列数据所属的整行数据。

若不相等,则按照依次比较的顺序,继续获取该哈希槽中下一个哈希节点存储的数据进行哈希探测,若下一个哈希节点为空,即当前哈希节点为该冲突的哈希槽中的最后一个哈希节点,说明第二表格中当前匹配列数据哈希探测失败,丢弃当前匹配列数据所属的整行数据。

按照上述方式对第二表格中的各匹配列数据均进行哈希探测,若对第二表格中所有的匹配列数据均探测完毕,那么可以执行sql语句中的其他操作。

在本申请实施例中,针对冲突的哈希槽,在第一表格的参考列数据各不相同的情况下,按照顺序存储的方式可以避免在哈希探测过程中对每条数据都进行比较。在第一表格的参考列数据相同的情况下,通过将相同的参考列数据存储于同一个哈希节点的链表中的方式,可以避免在哈希探测过程中,对相同的数据进行重复比较。类似地,本申请实施例提供的实现方式也可以针对现有技术中第二表格为第一表格的子集的情况下,避免对所有数据进行逐一比较,即通过本申请实施例提供的实现方式可以有效解决哈希连接中存在的问题,提高哈希探测效率。

图4为本申请实施例提供的一种基于哈希连接的探测装置,如图4所示,该装置可以包括创建模块401、确定模块402、存储模块403、探测模块404;

其中,创建模块,用于创建第一表格的哈希表,创建的哈希表包括哈希槽;

确定模块,用于确定第一表格中各参考列数据在哈希表中对应的哈希槽;

存储模块,用于根据各参考列数据的哈希槽是否冲突选择相应的存储方式依次将各参考列数据所属的整行数据存储至对应的哈希槽,并根据存储结果设置各哈希槽的冲突标记;

探测模块,用于根据冲突标记和第二表格中的数据进行哈希探测,第二表格与第一表格哈希连接。

在一种示例中,若各参考列数据的哈希槽不存在冲突,则存储模块用于将第一表格中当前参考列数据所属的整行数据存储于对应哈希槽的哈希节点的链表中;

或者,若各参考列数据的哈希槽存在冲突,则存储模块用于根据第一表格中当前参考列数据与冲突的哈希槽的哈希节点中已存储的参考列数据是否相同选择对应的存储方式,将当前参考列数据所属的整行数据存储至对应哈希节点的链表中。

示例性地,若当前参考列数据与已存储的参考列数据相同,则存储模块用于将当前参考列数据所属的整行数据存储至已存储的参考列数据所属的哈希节点的链表中;

相反,若当前参考列数据与已存储的参考列数据不相同,则存储模块用于以顺序存储的方式将当前参考列数据所属的整行数据存储至冲突的哈希槽的其他哈希节点的链表中。

其中,上述哈希槽的冲突标记表示哈希槽是否为冲突的哈希槽。

在一种示例中,探测模块可以用于执行以下步骤,例如:

步骤一:确定第二表格中当前匹配列数据的哈希槽;

步骤二:在第二表格为第一表格的子集的情况下,根据冲突标记和当前数据的哈希槽进行哈希探测;

步骤三:获取第二表格中的下一个匹配列数据,并将下一个匹配列数据确定为当前匹配列数据;

重复上述步骤一至步骤三,直至对第二表格中的所有匹配列数据都执行完哈希探测。

在一种示例中,在冲突标记表示哈希槽不为冲突的哈希槽的情况下,若哈希槽为空,则探测模块用于丢弃当前匹配列数据所属的整行数据;或者,若哈希槽不为空,则探测模块用于输出哈希槽的哈希节点存储的整行数据和当前匹配列数据所属的整行数据。

在冲突标记表示哈希槽为冲突的哈希槽的情况下,探测模块可以用于将当前匹配列数据与哈希槽中各哈希节点存储的参考列数据依次进行比较;若当前匹配列数据与哈希槽当前哈希节点存储的参考列数据相等,则探测模块输出参考列数据所属的整行数据和当前匹配列数据所属的整行数据;或者,若当前匹配列数据与哈希槽当前哈希节点存储的参考列数据不相等,且当前哈希节点为哈希槽的最后一个哈希节点,则探测模块丢弃当前匹配列数据所属的整行数据。

本申请实施例所提供的基于哈希连接的探测装置可执行本申请图1所提供的基于哈希连接的探测方法,具备执行方法相应的功能单元和有益效果。

图5为本申请实施例5提供的一种电子设备的结构示意图,如图5所示,该设备包括处理器501、存储器502、输入装置503和输出装置504;设备中处理器的数量可以是一个或多个,图5中以一个处理器为例;设备中的处理器、存储器、输入装置和输出装置可以通过总线或其他方式连接,图5中以通过总线连接为例。

存储器作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本申请图1中的基于哈希连接的探测方法对应的程序指令/模块(例如,基于哈希连接的探测装置中的创建模块401、确定模块402、存储模块403、探测模块404)。处理器通过运行存储在存储器中的软件程序、指令以及模块,从而执行设备的各种功能应用以及数据处理,即实现上述的基于哈希连接的探测方法。

存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端的使用所创建的数据等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器可进一步包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至设备/终端/服务器。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

输入装置可用于接收输入的数字或字符信息,以及产生与设备的用户设置以及功能控制有关的键信号输入。输出装置可包括操作面板等显示设备。

本申请实施例还提供一种包含计算机可执行指令的存储介质,该计算机可执行指令在由计算机处理器执行时用于执行一种基于哈希连接的探测方法,该方法包括:

创建第一表格的哈希表,哈希表包括哈希槽;

确定第一表格中各参考列数据在哈希表中对应的哈希槽;

根据各参考列数据的哈希槽是否冲突选择相应的存储方式依次将各参考列数据所属的整行数据存储至对应的哈希槽,并根据存储结果设置各哈希槽的冲突标记;

根据冲突标记和第二表格中的数据进行哈希探测,第二表格与第一表格哈希连接。

通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本申请可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、闪存(flash)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述的方法。

值得注意的是,上述基于哈希连接的探测装置中所包括的模块只是按照功能逻辑进行划分,但并不局限于上述的划分方式,只要能够实现相应的功能即可;另外,电子控制模块等模块的具体名称也只是为了便于区分,并不用于限制本申请的保护范围。

注意,上述仅为本申请的较佳实施例及所运用技术原理。本领域技术人员会理解,本申请不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本申请的保护范围。因此,虽然通过以上实施例对本申请进行了较为详细的说明,但是本申请不仅仅限于以上实施例,在不脱离本申请构思的情况下,还可以包括更多其他等效实施例,而本申请的范围由所附的权利要求范围决定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1