一种查询唯一值的方法及设备与流程

文档序号:15271791发布日期:2018-08-28 22:31阅读:179来源:国知局

本申请涉及计算机领域,尤其涉及一种查询唯一值的方法及设备



背景技术:

稀疏列是指稀疏列所属的总的记录数据很多,但是值却不多的列,例如,某个环卫公司有1000辆车,若每辆车每天可能产生10万条行驶轨迹的记录数据,其中这些记录数据中有一个列存储的是车辆的车牌,那么在总的1亿记录中,车牌所属列的值实际上只有1000个。唯一值,用于指示在一张表中,某列的取值个数,例如在该稀疏列(车牌)的唯一值就是这1000个车牌。

现有技术中,由于稀疏列所属的记录数据存储在没有规则拍讯的堆表中,若需计算稀疏列的唯一值,则需要扫描全表,对稀疏列进行排序,然后去除稀疏列的重复值,得到稀疏列的唯一值的个数。例如如图1所示,在上述车辆在一天中的所有1亿条记录数据存储于堆表中,当需计算有多少辆车子出勤了的时候,则需对上述1亿的记录数据进行排序,然后去除车辆对应的车牌的重复值所属的记录数据,每个车辆对应的车牌所属的记录数据只留下一条,则计算得到的车辆对应的车牌的总数,可以得到车牌(稀疏列)的唯一值的个数,导致整个过程的资源开销非常大且效率低。进一步地,现有技术还使用索引,对需要计算唯一值的稀疏列创建索引树,由于索引是已经对稀疏列的排序后的数据组织,故不需要排序的过程,又由于数据库是支持并行访问的,每天记录数据有版本信息但索引没有版本信息,需要扫描索引树中的所有的叶子节点,然后去重,并统计稀疏列的唯一值所属的记录数据条数,导致查找稀疏列的唯一值的工作量大且效率低,进而无法快速地获取稀疏列的唯一值。



技术实现要素:

本申请的一个目的是提供一种查询唯一值的方法及设备,解决现有技术中查找唯一值导致的工足量大且效率低的问题。

根据本申请的一个方面,提供了一种含有稀疏列的数据的存储方法,该方法包括:

获取数据的存储位置和对应的所述数据中的稀疏列的值,将数据的存储位置和对应的所述数据中的稀疏列的值作为指引记录;

按照所述稀疏列的值从小到大的顺序,将所述指引记录依次存入索引树的各连续的叶子节点;

在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值。

进一步地,上述方法中,所述在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值,包括:

在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最大值或最小值。

进一步地,上述方法中,所述上层节点包括所述叶子节点的上一层根节点,

在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值,包括:

在所述根节点中记录其所包含的叶子节点及该叶子节点中的指引记录中的稀疏列的值的最值。

进一步地,上述方法中,所述上层节点包括所述叶子节点的上一层分支节点和所述分支节点的上一层根节点,

在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值,包括:

在所述叶子节点的上一层的分支节点中记录其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值;

在根节点记录其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值。

进一步地,上述方法中,所述上层节点包括根节点,处于所述根节点和叶子节点之间的多层分支节点,

在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值,包括:

在分支节点中记录其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值,或在分支节点中记录其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值;

在根节点记录其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值。

根据本申请的另一个方面,提供了一种查询唯一值的方法,该方法包括:

根据索引树中的上层节点中记录的该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值,确定当前待查询的稀疏列的值;

在所述叶子节点中依次查找当前待查询的稀疏列的值所属的第一条指引记录,其中,所述指引记录包括数据的存储位置和对应的所述数据中的稀疏列的值,所述指引记录按照所述稀疏列的值从小到大的顺序,依次存于索引树的各连续的叶子节点;

根据查找到的第一条指引记录中数据的存储位置获取所述数据,将获取到的所述数据中的稀疏列的值加入唯一值集合。

进一步地,上述方法中,根据查找到的指引记录中数据的存储位置获取所述数据之后,还包括:

若未获取到,在当前查询的叶子节点或后续叶节点依次查找当前待查询的稀疏列的值所属的下一条指引记录;

根据查找到的下一条指引记录中的数据的存储位置获取所述数据,若获取到,将所述含有稀疏列的值加入唯一值集合,若未获取,重复上述步骤直至获取所述数据,则将获取到的所述数据中的稀疏列的值加入唯一值集合,或直至查询到的下一条指引记录中的稀疏列的值不同于当前待查询的稀疏列的值。

进一步地,上述方法中,若索引树中的上层节点中记录的是该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最小值,

确定当前待查询的稀疏列的值,包括:

由上层节点所包含的叶子节点中的指引记录的稀疏列的值的所有最小值中的最小值开始,按从小到大的顺序,依次将叶子节点中的指引记录的稀疏列的值作为当前待查询的稀疏列的值。

进一步地,上述方法中,若索引树中的上层节点中记录的是该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最大值,

确定当前待查询的稀疏列的值,包括:

由上层节点所包含的叶子节点中的指引记录的稀疏列的值的所有最大值中的最大值开始,按从大到小的顺序,依次将叶子节点中的指引记录的稀疏列的值作为当前待查询的稀疏列的值。

进一步地,上述方法中,所述上层节点包括所述叶子节点的上一层根节点,

根据索引树中的上层节点中记录的该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值,包括:

根据索引树中的根节点中记录的其所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值。

进一步地,上述方法中,所述上层节点包括所述叶子节点的上一层分支节点和所述分支节点的上一层根节点,

根据索引树中的上层节点中记录的该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值,包括:

先根据根节点记录的其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值;

再根据所述叶子节点的上一层的分支节点中记录的其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值。

进一步地,上述方法中,所述上层节点包括根节点,处于所述根节点和叶子节点之间的多层分支节点,

根据索引树中的上层节点中记录的该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值,包括:

先根据根节点记录的其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值;

再根据分支节点中记录该分支节点所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值;

最后根据分支节点中记录其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值。

根据本申请的另一个方面,提供了一种含有稀疏列的数据的存储设备,其中,所述设备包括:

获取装置,用于获取数据的存储位置和对应的所述数据中的稀疏列的值,将数据的存储位置和对应的所述数据中的稀疏列的值作为指引记录;

存储装置,用于按照所述稀疏列的值从小到大的顺序,将所述指引记录依次存入索引树的各连续的叶子节点;

记录装置,用于在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值。

进一步地,上述设备中,所述记录装置用于:

在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最大值或最小值。

进一步地,上述设备中,所述上层节点包括所述叶子节点的上一层根节点,

所述记录装置用于:

在所述根节点中记录其所包含的叶子节点及该叶子节点中的指引记录中的稀疏列的值的最值。

进一步地,上述设备中,所述上层节点包括所述叶子节点的上一层分支节点和所述分支节点的上一层根节点,

所述记录装置用于:

在所述叶子节点的上一层的分支节点中记录其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值;

在根节点记录其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值。

进一步地,上述设备中,所述上层节点包括根节点,处于所述根节点和叶子节点之间的多层分支节点,

所述记录装置用于:

在分支节点中记录其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值,或在分支节点中记录其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值;

在根节点记录其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值。

根据本申请的另一个方面,提供了一种查询唯一值的设备,其中,所述设备包括:

确定查找装置,用于根据索引树中的上层节点中记录的该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值,

确定当前待查询的稀疏列的值,在所述叶子节点中依次查找当前待查询的稀疏列的值所属的第一条指引记录,其中,所述指引记录包括数据的存储位置和对应的所述数据中的稀疏列的值,所述指引记录按照所述稀疏列的值从小到大的顺序,依次存于索引树的各连续的叶子节点;

唯一值统计装置,用于根据查找到的第一条指引记录中数据的存储位置获取所述数据,将获取到的所述数据中的稀疏列的值加入唯一值集合。

进一步地,上述设备中,所述唯一值统计装置还用于:

若未获取到,在当前查询的叶子节点或后续叶节点依次查找当前待查询的稀疏列的值所属的下一条指引记录;

根据查找到的下一条指引记录中的数据的存储位置获取所述数据,若获取到,将所述含有稀疏列的值加入唯一值集合,若未获取,重复上述步骤直至获取所述数据,则将获取到的所述数据中的稀疏列的值加入唯一值集合,或直至查询到的下一条指引记录中的稀疏列的值不同于当前待查询的稀疏列的值。

进一步地,上述设备中,若索引树中的上层节点中记录的是该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最小值,

所述确定查找装置用于:

由上层节点所包含的叶子节点中的指引记录的稀疏列的值的所有最小值中的最小值开始,按从小到大的顺序,依次将叶子节点中的指引记录的稀疏列的值作为当前待查询的稀疏列的值。

进一步地,上述设备中,若索引树中的上层节点中记录的是该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最大值,

所述确定查找装置用于:

由上层节点所包含的叶子节点中的指引记录的稀疏列的值的所有最大值中的最大值开始,按从大到小的顺序,依次将叶子节点中的指引记录的稀疏列的值作为当前待查询的稀疏列的值。

进一步地,上述设备中,所述上层节点包括所述叶子节点的上一层根节点,

所述确定查找装置用于:

根据索引树中的根节点中记录的其所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值。

进一步地,上述设备中,所述上层节点包括所述叶子节点的上一层分支节点和所述分支节点的上一层根节点,

所述确定查找装置用于:

先根据根节点记录的其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值;

再根据所述叶子节点的上一层的分支节点中记录的其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值。

进一步地,上述设备中,所述上层节点包括根节点,处于所述根节点和叶子节点之间的多层分支节点,

所述确定查找装置用于:

先根据根节点记录的其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值;

再根据分支节点中记录该分支节点所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值;

最后根据分支节点中记录其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值。

根据本申请的另一个方面,提供了一种基于计算的设备,包括:

处理器;以及

被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器:

获取数据的存储位置和对应的所述数据中的稀疏列的值,将数据的存储位置和对应的所述数据中的稀疏列的值作为指引记录;

按照所述稀疏列的值从小到大的顺序,将所述指引记录依次存入索引树的各连续的叶子节点;

在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值。

根据本申请的另一个方面,提供了一种基于计算的设备,包括:

处理器;以及

被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器:

根据索引树中的上层节点中记录的该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值,确定当前待查询的稀疏列的值;

在所述叶子节点中依次查找当前待查询的稀疏列的值所属的第一条指引记录,其中,所述指引记录包括数据的存储位置和对应的所述数据中的稀疏列的值,所述指引记录按照所述稀疏列的值从小到大的顺序,依次存于索引树的各连续的叶子节点;

根据查找到的第一条指引记录中数据的存储位置获取所述数据,将获取到的所述数据中的稀疏列的值加入唯一值集合。

与现有技术相比,本申请在提供的一种含有稀疏列的数据的存储方法中,通过先获取堆表中记录的数据的存储位置和对应的所述数据中的稀疏列的值,将该数据的存储位置和对应的所述数据中的稀疏列的值作为指引记录;按照所述稀疏列的值从大到小的顺序,将所述指引记录依次存入索引树的各连续的叶子节点中;并在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值,不仅实现了对稀疏列创建索引树,以便后续快速地获取到需统计稀疏列的值的唯一值,还将堆表中的稀疏列的值及其所属的所述数据的存储位置作为指引记录写入个索引树的各连续的叶子节点中,以便后续从叶子节点中的指引记录中的存储位置找到该稀疏列的值所属的数据。

进一步的,本申请还在提供的一种查询唯一值的方法中,通过已创建好的索引树,根据索引树中的上层节点中记录的该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值,确定当前待查询的稀疏列的值,并在所述叶子节点中依次查找当前待查询的稀疏列的值所属的第一条指引记录,其中,所述指引记录包括数据的存储位置和对应的所述数据中的稀疏列的值,所述指引记录按照所述稀疏列的值从小到大的顺序,依次存于索引树的各连续的叶子节点;并根据查找到的第一条指引记录中数据的存储位置,获取对应的所述数据,将获取到的所述数据中的稀疏列的值加入唯一值集合,实现了基于该索引树,完成对待查询的稀疏列的值的唯一值的快速获取。

附图说明

通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:

图1示出现有方案的一种查询唯一值的方法流程图;

图2示出根据本申请一个方面的一种含有稀疏列的数据的存储方法中索引树的创建流程图;

图3示出根据本申请另一个方面的一种含有稀疏列的数据的存储方法中索引树的创建流程图;

图4示出根据本申请另一个方面的一种含有稀疏列的数据的存储方法中索引树的创建流程图;

图5示出根据本申请一个方面的一种查询唯一值方法中从稀疏列的值的最小值中的最小值开始查询的流程图;

图6示出根据本申请一个方面的一种查询唯一值方法中从稀疏列的值的最大值中的最大值开始查询的流程图;

图7示出根据本申请一个方面的一种查询唯一值方法中从稀疏列的值的最小值中的最小值开始查询的第一次查询流程图;

图8示出根据本申请一个方面的一种查询唯一值方法中从稀疏列的值的最小值中的最小值开始查询的第二次查询流程图;

图9示出根据本申请一个方面的一种含有稀疏列的数据的存储设备;

图10示出根据本申请另一个方面的一种查询唯一值的设备。

附图中相同或相似的附图标记代表相同或相似的部件。

具体实施方式

下面结合附图对本申请作进一步详细描述。

在本申请一个典型的配置中,终端、服务网络的设备和可信方均包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。

根据本申请一个方面的一种含有稀疏列的数据的存储方法,应用于数据库对应的服务器端,该方法包括步骤s11、步骤s12和步骤s13,其中,首先获取数据库中的堆表中记录的所有数据,在所述步骤s11中获取各数据的存储位置和对应的该数据中的稀疏列的值,并将每一条记录的数据的存储位置和对应的该数据中的稀疏列的值作为一条指引记录,得到各数据的存储位置与其对应的数据中的稀疏列的值的指引记录,并将所有的指引记录按照所述稀疏列的值从小到大的顺序,依次存入索引树的各连续的叶子节点(leafpage)(例如,叶子节点1、叶子节点2、叶子节点3、……、叶子节点m);并在各叶子节点对应的上层节点中记录该上层节点所包含的叶子节点及其该叶子节点中指引记录的稀疏列的值的最值(例如,在叶子节点1的上层节点中记录上层节点所包含的叶子节点1、2、……、m及叶子节点1中所有的指引记录的稀疏列的值的最值、叶子节点2中所有的指引记录的稀疏列的值的最值、……及叶子节点m中所有的指引记录的稀疏列的值的最值),不仅实现了对稀疏列创建索引树,以便后续快速地获取到需统计稀疏列的值的唯一值,还将堆表中的稀疏列的值及其所属的所述数据的存储位置作为指引记录写入个索引树的各连续的叶子节点中,以便后续从叶子节点中的指引记录中的存储位置找到该稀疏列的值所属的数据。

本申请的索引树还包括元数据节点,其中,所述元数据节点(metapage)中存储的是索引树中的根节点(rootpage)在索引树中的具体位置,以便更快地查找到该索引树下的根节点,同时,在创建索引树之前,该元数据节点还预置需创建的索引的层数和对应各层节点的节点数预置及节点对应的记录结果的数量预置,例如,在元数据节点中预置创建的索引树包括根节点和叶子节点,包括4个叶子节点且每个叶子节点最多存储4条指引记录,进而实现对索引树的管理。

需要说明的是,所述数据是存在数据库中的堆表中的,其中堆表中的数据是是没有存储顺序的,在堆表中以数据块为单位在文件末尾处追加存储空间,每个数据块中可以记录至少一条数据,随着堆表中的数据的不断更新、删除等,一些数据块会释放存储空间,则新插入的需要记录的数据则随机地在有空余存储空间的堆表对应数据块中进行存储。

本申请实施例中的所述叶子节点是所述索引树的最底层,其中该叶子节点中不仅存储了堆表中的数据的存储位置rowid(例如在堆表中的数据块id+行号),还存储了该数据中的指引记录中的稀疏列的值,例如叶子节点1中包括稀疏列1、稀疏列2,则有叶子节点中的指引记录为{(指引记录1:稀疏列1的value1,存储位置rowid1)、(指引记录2:稀疏列2的value1,存储位置rowid3)及(指引记录3:稀疏列1的value2,存储位置rowid2)}。

进一步地,所述步骤s13包括:在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最大值或最小值。例如,若稀疏列为车辆的车牌,有两个叶子节点分别为叶子节点1和叶子节点2,其中,叶子节点1包括的指引记录为{指引记录1(车牌1,存储位置rowid1)和指引记录1(车牌2,存储位置rowid9)},叶子节点2包括的指引记录为{指引记录1(车牌3,存储位置rowid14)和指引记录1(车牌4,存储位置rowid23)},则有在叶子节点的上层节点中记录叶子节点1及其中指引记录的车牌的值的最小值:车牌1和叶子节点2及其中指引记录的车牌的值的最小值:车牌3;或在叶子节点的上层节点中记录叶子节点2及其中指引记录的车牌的值的最大值:车牌2和叶子节点2及其中指引记录的车牌的值的最大值:车牌4,实现了将各个叶子节点中记录的所有指引记录中的稀疏列的值中的最值提取到上层节点中,以便后续基于稀疏列的值的最值和对应的叶子节点来查找到该稀疏列的值所属的数据,进而能够快速地获取到稀疏列的唯一值。

进一步地,当堆表中记录的数据较少时,所述索引树包含的上层节点为所述叶子节点的上一层根节点,即该索引树的最上层为根节点,该索引树还包括最下层的叶子节点,即在堆表中记录的数据较少时,所述索引树包括根节点和叶子节点;接着所述步骤s13在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值,包括:在所述根节点中记录其所包含的叶子节点及该叶子节点中的指引记录中的稀疏列的值的最值。

在本申请一实施例中,如图2所示,堆表中记录有16条数据,将每一数据的存储位置及其中的稀疏列的值作指引记录分别存储于索引树中的叶子节点1、叶子节点2、叶子节点3和叶子节点4中,则有叶子节点1写入的有:{指引记录1:(车牌1、数据块1行号1)、指引记录2:(车牌1、数据块2行号1)、指引记录3:(车牌1、数据块3行号1)和指引记录4:(车牌2、数据块1行号2)},叶子节点2中写入的有:{指引记录5:(车牌2、数据块1行号3)、指引记录6:(车牌2、数据块3行号2)、指引记录7:(车牌3、数据块2行号4)和指引记录8:(车牌3、数据块3行号3)},叶子节点3中写入的有:{指引记录9:(车牌3、数据块4行号1)、指引记录10:(车牌4、数据块1行号4)、指引记录11:(车牌4、数据块3行号4)和指引记录12:(车牌4、数据块4行号3)},以及叶子节点4中写入的有:{指引记录13:(车牌5、数据块2行号3)、指引记录14:(车牌5、数据块4行号2)、指引记录15:(车牌6、数据块2行号2)和指引记录16:(车牌6、数据块4行号4)},接着所述步骤s13在所述根节点中记录其所包含的叶子节点1至叶子节点4及各叶子节点中的指引记录中的稀疏列的值的最小值,则有根节点中的记录为{(车牌1:叶子节点1)、(车牌2:叶子节点2)、(车牌3:叶子节点3)和(车牌5:叶子节点5)},实现了将堆表中的含有稀疏列的所有数据的指引记录写入各连续的叶子节点中,并实现了将每一叶子节点中的指引记录的稀疏列的值中的最小值及其所在的叶子节点存入根节点中,以便后续基于记录的稀疏列的值中的最小值及其所在的叶子节点快速地获取待查询的稀疏列的值及其对应的在堆表中记录的有效的数据,进而减少查找工作量并提高查找的工作效率。

在本申请的另一实施例中,如图3所示,若堆表中记录有16条数据,将每一数据的存储位置及其中的稀疏列的值作指引记录分别存储于索引树中的叶子节点1、叶子节点2、叶子节点3和叶子节点4中,则有叶子节点1写入的有:{指引记录1:(车牌1、数据块1行号1)、指引记录2:(车牌1、数据块2行号1)、指引记录3:(车牌1、数据块3行号1)和指引记录4:(车牌2、数据块1行号2)},叶子节点2中写入的有:{指引记录5:(车牌2、数据块1行号3)、指引记录6:(车牌2、数据块3行号2)、指引记录7:(车牌3、数据块2行号4)和指引记录8:(车牌3、数据块3行号3)},叶子节点3中写入的有:{指引记录9:(车牌3、数据块4行号1)、指引记录10:(车牌4、数据块1行号4)、指引记录11:(车牌4、数据块3行号4)和指引记录12:(车牌4、数据块4行号3)},以及叶子节点4中写入的有:{指引记录13:(车牌5、数据块2行号3)、指引记录14:(车牌5、数据块4行号2)、指引记录15:(车牌6、数据块2行号2)和指引记录16:(车牌6、数据块4行号4)},接着所述步骤s13在所述根节点中记录其所包含的叶子节点1至叶子节点4及各叶子节点中的指引记录中的稀疏列的值的最大值,则有根节点中的记录为{(车牌2:叶子节点1)、(车牌3:叶子节点2)、(车牌4:叶子节点3)和(车牌6:叶子节点4)},实现了将堆表中的含有稀疏列的所有数据的指引记录写入各连续的叶子节点中,并实现了将每一叶子节点中的指引记录的稀疏列的值中的最大值及其所在的叶子节点存入根节点中,以便后续基于记录的稀疏列的值中的最大值及其所在的叶子节点快速地获取待查询的稀疏列的值及其对应的在堆表中记录的有效的数据,进而减少查找工作量并提高查找的工作效率。

进一步地,当堆表中记录的数据较多时,所述索引树包含的上层节点包括所述叶子节点的上一层分支节点和所述分支节点的上一层根节点,即该索引树的最上层为根节点,中间层为一层分支节点,该索引树还包括最下层的叶子节点,即在堆表中记录的数据较多时,所述索引树包括根节点、一层分支节点以及叶子节点;接着所述步骤s13在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值,包括:

在所述叶子节点的上一层的分支节点中记录其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值;

在根节点记录其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值。

下面选择以所述最值为最小值为例,对所述步骤s13进行详细地实施例解释。即在本申请的一实施例中,如图4所示,在堆表中记录有n×n×n条数据,在元数据节点(metapage)中预设该索引树包括根节点(rootpage)、一层分支节点(branchpage)和叶子节点(leafpage),其中,预设单个节点可以存储n条指引记录,则此处的索引树可以存储n×n×n条指引记录,预设有n个分支节点,每个分支节点下包括有n个叶子节点,及每个叶子节点对应的可以最多存储n条指引记录,得到将稀疏列(车辆的车牌)从车牌1开始,将车牌1在堆表中的出勤记录按照出勤顺序,依次将各数据的存储位置与其对应的车牌1的指引记录写入分支叶子节点1,待叶子及节点1写完n条数据后,将依次将车牌1对应的指引记录写入叶子节点2中,写完车牌1对应在堆表中记录的数据后,接着将与车牌2对应的指引记录按出勤顺序写入叶子节点2及后续的叶子节点中,如此,将1000个车牌对应的在堆表中的出勤记录的数据均以指引的形式写入各连续的叶子节点中;接着所述步骤s13在叶子节点的上一层的分支节点中记录其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最小值,如图4中的分支节点1中记录有稀疏列的最小值车牌1及对应的叶子节点1、车牌1及对应的叶子节点2、车牌1及对应的叶子节点3、……、以及车牌1及对应的叶子节点n;分支节点2中记录有稀疏列的最小值车牌1及其对应的叶子节点n+1、车牌2及其对应的叶子节点n+2、车牌2及其对应的叶子节点n+3、……、车牌2及其对应的叶子节点m,……,依次将各个叶子节点中指引记录的稀疏列(车辆的车牌)的值的最小值及对应的叶子节点作为一条记录对应的写入对应的上一层的分支节点;接着,在根节点记录其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最小值,如图4中的根节点中记录有各分支节点的最小值及其对应的分支节点:车牌1:分支节点1,车牌1:分支节点2,车牌3:分支节点3,……,车牌1000:分支节点n,实现了将堆表中记录的较多的数据的情况下的所有的数据以指引记录的形式分别映射写入至索引树中的各连续的叶子节点中,并实现了将每一叶子节点中的指引记录的稀疏列的值中的最小值及其所在的叶子节点存入对应的分支节点中,并将各分支节点中的稀疏列的值中的最小值及其对应的分支节点作为一条记录写入对应的根节点中,以便后续基于根节点中记录的稀疏列的值中的最小值及其所在的分支节点和对应下一层的分支节点记录的稀疏列的最小值及其对应的叶子节点,进而快速地获取待查询的稀疏列的值及其对应的在堆表中记录的有效的数据,进而减少查找工作量并提高查找的工作效率。

进一步地,当堆表中记录的数据很多时,所述索引树包含的上层节点包括根节点,处于所述根节点和叶子节点之间的多层分支节点,该索引树还包括最下层的叶子节点,即在堆表中记录的数据很多时,所述索引树包括根节点、多层分支节点以及叶子节点;接着所述步骤s13在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值,包括:

在分支节点中记录其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值,或在分支节点中记录其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值;

在根节点记录其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值。

下面选择以所述最值为最小值且所述分支节点的层数为2层为例,对所述步骤s13进行详细地实施例解释。即在本申请的一实施例中,在堆表中记录有n×n×n×n条数据,在元数据节点(metapage)中预设该索引树包括根节点(rootpage)、第一层分支节点(firstbranchpage)、第二层分支节点(secondbranchpage)和叶子节点(leafpage),其中,预设单个节点可以存储n条指引记录,则此处的索引树可以存储n×n×n×n条指引记录,预设每层的分支节点有n个,每个分支节点下包括有n个叶子节点,及每个叶子节点对应的可以最多存储n条指引记录,得到将稀疏列(车辆的车牌)从车牌1开始,将车牌1在堆表中的出勤记录按照出勤顺序,依次将各数据的存储位置与其对应的车牌1的指引记录写入分支叶子节点1,待叶子及节点1写完n条数据后,将依次将车牌1对应的指引记录写入叶子节点2中,写完车牌1对应在堆表中记录的数据后,接着将与车牌2对应的指引记录按出勤顺序写入叶子节点2及后续的叶子节点中,如此,将1000个车牌对应的在堆表中的出勤记录的数据均以指引的形式写入各连续的叶子节点中;接着所述步骤s13在叶子节点的上一层的分支节点中记录其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最小值,在第二层分支节点1中记录有稀疏列的最小值车牌1及对应的叶子节点1、车牌1及对应的叶子节点2、车牌1及对应的叶子节点3、……、以及车牌1及对应的叶子节点n;第二层分支节点2中记录有稀疏列的最小值车牌1及其对应的叶子节点n+1、车牌2及其对应的叶子节点n+2、车牌2及其对应的叶子节点n+3、……、车牌2及其对应的叶子节点m,……,依次将各个叶子节点中指引记录的稀疏列(车辆的车牌)的值的最小值及对应的叶子节点作为一条记录对应的写入对应的上一层的第二层分支节点;接着,在第一层分支节点1中记录对应下层的各第二层分支节点及其对应的稀疏列(车牌)的最小值;接着,在根节点记录其所包含的第一层分支节点及该第一层分支节点中的稀疏列的值的最小值,在根节点中记录有各第一层分支节点的最小值及其对应的第一层分支节点:车牌1:第一层分支节点1,车牌1:第一层分支节点2,车牌3:第一层分支节点3,……,车牌1000:第一层分支节点n,实现了将堆表中记录的较多的数据的情况下的所有的数据以指引记录的形式分别映射写入至索引树中的各连续的叶子节点中,并实现了将每一叶子节点中的指引记录的稀疏列的值中的最小值及其所在的叶子节点存入对应的第二层分支节点中,并将各第二层分支节点中的稀疏列的值中的最小值及其对应的第二层分支节点作为一条记录写入对应的第一层分支节点中,最后将第一层分支节点中的稀疏列的值中的最小值及其对应的第一层分支节点作为一条记录写入对应的根节点中,以便后续基于根节点中记录的稀疏列的值中的最小值及其所在的分支节点和对应下一层的第一层分支节点记录的稀疏列的最小值及其对应的第二层分支节点和对应的下一层的第二层分支节点记录的稀疏列的最小值及其对应的叶子节点,进而快速地获取待查询的稀疏列的值及其对应的在堆表中记录的有效的数据,进而减少查找工作量并提高查找的工作效率。

根据本申请另一个方面的一种查询唯一值的方法,应用于数据库对应的服务器端,该方法包括步骤s21和步骤s22,其中,该方法通过已创建好的索引树,所述步骤s21根据索引树中的上层节点中记录的该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值,确定当前待查询的稀疏列的值;接着在所述步骤s21中,在所述叶子节点中依次查找当前待查询的稀疏列的值所属的第一条指引记录,其中,所述指引记录包括数据的存储位置和对应的所述数据中的稀疏列的值,所述指引记录按照所述稀疏列的值从小到大的顺序,依次存于索引树的各连续的叶子节点;最后所述步骤s22根据查找到的第一条指引记录中数据的存储位置获取所述数据,将获取到的所述数据中的稀疏列的值加入唯一值集合,实现了基于该索引树,完成对待查询的稀疏列的值的唯一值的快速获取,避免了对索引树中的全部叶子节点进行扫描,也避免了扫描所有叶子节点中的指引记录对应的数据的存储位置的扫描,只要获取到待查询的稀疏列的值对应的第一条指引记录在堆表中对应的数据时,则可返回至上层节点,继续查找待查询的稀疏列的值的下一值,此种查找方式不仅减少了扫描索引树的工作量,还大大提升了查找待查询的稀疏列的值的唯一值的工作效率。

进一步地,在所述步骤s22根据查找到的指引记录中数据的存储位置获取所述数据之后,还包括:

若未获取到,在当前查询的叶子节点或后续叶节点依次查找当前待查询的稀疏列的值所属的下一条指引记录;

根据查找到的下一条指引记录中的数据的存储位置获取所述数据,若获取到,将所述含有稀疏列的值加入唯一值集合,若未获取,重复上述步骤直至获取所述数据,则将获取到的所述数据中的稀疏列的值加入唯一值集合,或直至查询到的下一条指引记录中的稀疏列的值不同于当前待查询的稀疏列的值。

本申请一实施例中,若在所述步骤s21中查找当前待查询稀疏列的值(车牌1)所属的第一条指引记录的时候,所述步骤s22根据在叶子节点中查找到的当前待查询稀疏列的值(车牌1)所属的第一条指引记录中的存储位置,在堆表中获取到对应的所述数据,则将该获取到的数据中的稀疏列的值加入唯一值集合{车牌1};若在所述步骤s22中根据在叶子节点中查找到的当前待查询稀疏列的值(车牌1)所属的第一条指引记录中的存储位置,未在堆表中获取到对应的数据,则在当前查询的叶子节点(例如,当前待查询稀疏列的值(车牌1)所属的下一条指引记录和当前待查询稀疏列的值(车牌1)所属的第一条指引记录处于同一个叶子节点中)或后续叶节点(例如,当前待查询稀疏列的值(车牌1)所属的下一条指引记录和当前待查询稀疏列的值(车牌1)所属的第一条指引记录处于相邻的不同叶子节点中)依次查找当前待查询的稀疏列的值所属的下一条指引记录。

接着本申请的上述实施例,在根据查询当前待查询稀疏列的值(车牌1)所属的第一条指引记录来在堆表中获取对应的数据失败后,接着根据查找到的下一条指引记录中的数据的存储位置在堆表中获取所述数据,若获取到,将所述含有稀疏列的值加入唯一值集合{车牌1},若未获取到的话,则重复上述依次查询当前待查询稀疏列的值(车牌1)所属的下一条指引记录的步骤,直至在堆表中获取到对应的所述数据(例如,当前待查询稀疏列的值(车牌1)所属的前几条指引记录中的数据的存储位置对应在堆表中不存在对应的数据,即数据已失效,而在当前待查询稀疏列的值(车牌1)所属的后续的某一条指引记录中的数据的存储位置对应在堆表中的数据有效地存在),则将获取到的所述数据中的稀疏列的值加入唯一值集合{车牌1},通过上述重复循环地步骤,减少了对上层节点及其对应的叶子节点的扫描,进而大大降低了查找待查询的稀疏列的值的唯一值的工作量,还提高了查找的工作效率。

进一步地,若索引树中的上层节点中记录的是该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最小值,

所述步骤s21确定当前待查询的稀疏列的值,包括:

由上层节点所包含的叶子节点中的指引记录的稀疏列的值的所有最小值中的最小值开始,按从小到大的顺序,依次将叶子节点中的指引记录的稀疏列的值作为当前待查询的稀疏列的值。

在本申请一实施例中,如图5所示,索引树中的上层节点(根节点)中记录的是该上层节点所包含的叶子节点及其叶子节点中的指引记录的稀疏列的值的最小值,即根节点中的记录为{(车牌1:叶子节点1)、(车牌2:叶子节点2)、(车牌3:叶子节点3)和(车牌5:叶子节点5)};所述步骤s21根据上层节点(根节点)中记录的稀疏列的值的所有最小值中的最小值(车牌1)开始,扫描图5中的灰色部分,得到稀疏列的值车牌1,然后按照从小到大的顺序,依次将叶子节点中的指引记录的稀疏列的值:车牌2、车牌3、车牌4、车牌5及车牌6作为当前待查询的稀疏列的值,实现将待查询的稀疏列的值的索引,进而使得获取的待查询的稀疏列的值的唯一值集合更加精确。

进一步地,若索引树中的上层节点中记录的是该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最大值,

确定当前待查询的稀疏列的值,包括:

由上层节点所包含的叶子节点中的指引记录的稀疏列的值的所有最大值中的最大值开始,按从大到小的顺序,依次将叶子节点中的指引记录的稀疏列的值作为当前待查询的稀疏列的值。

在本申请一实施例中,如图6所示,索引树中的上层节点(根节点)中记录的是该上层节点所包含的叶子节点及其叶子节点中的指引记录的稀疏列的值的最大值,即根节点中的记录为{(车牌1:叶子节点1)、(车牌2:叶子节点2)、(车牌3:叶子节点3)和(车牌5:叶子节点5)};所述步骤s21根据上层节点(根节点)中记录的稀疏列的值的所有最大值中的最大值(车牌6)开始,扫描图6中的灰色部分,得到待查询的稀疏列的值车牌6,然后按照从大到小的顺序,依次将叶子节点中的指引记录的稀疏列的值:车牌6、车牌5、车牌4、车牌3及车牌2作为当前待查询的稀疏列的值,实现将待查询的稀疏列的值的索引,进而使得获取的待查询的稀疏列的值的唯一值集合更加精确。

进一步地,所述上层节点包括所述叶子节点的上一层根节点,

所述步骤s21中的根据索引树中的上层节点中记录的该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值,包括:

根据索引树中的根节点中记录的其所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值。

下面以根据索引树中的根节点中记录的其所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最小值为例,对所述步骤s21和步骤s22进行举例说明。

在本申请一实施例中,如图5所示,索引树中的上层节点(根节点)中记录的是该上层节点所包含的叶子节点及其叶子节点中的指引记录的稀疏列的值的最小值,即根节点中的记录为{(车牌1:叶子节点1)、(车牌2:叶子节点2)、(车牌3:叶子节点3)和(车牌5:叶子节点5)};所述步骤s21根据上层节点(根节点)中记录的稀疏列的值的所有最小值中的最小值(车牌1)开始,按照从小到大的顺序,依次将叶子节点中的指引记录的稀疏列的值:车牌1、车牌2、车牌3、车牌4、车牌5及车牌6作为当前待查询的稀疏列的值。当在所述步骤s22中将车牌1作为当前待查询的稀疏列的值时,基于根节点中记录的车牌1对应的叶子节点1,在叶子节点1中查找包含有车牌1的第一条指引记录,得到{指引记录1:(车牌1、数据块1行号1)},然后基于该指引记录1中的存储位置{数据块1行号1}在堆表中获取该车牌1所属的数据,若在堆表中的{数据块1行号1}获取到该车牌1所属的数据,则将该数据中的稀疏列的值(车牌1)加入唯一值集合中;然后返回根节点将车牌2作为当前待查询的稀疏列的值,重复上述步骤,直至在堆表中的存储位置获取到车牌6所属的数据,即索引树中获取不到比车牌6更大的当前待查询的稀疏列的值为止,实现了对待查询的稀疏列的值的快速获取。

接着本申请的上述实施例,在图5中,所述步骤s21根据上层节点(根节点)中记录的稀疏列的值的所有最小值中的最小值(车牌1)开始,按照从小到大的顺序,依次将叶子节点中的指引记录的稀疏列的值:车牌1、车牌2、车牌3、车牌4、车牌5及车牌6作为当前待查询的稀疏列的值;在第一次将车牌1作为当前待查询的稀疏列的值时,在叶子节点1中查找包含有车牌1的第一条指引记录{指引记录1:(车牌1、数据块1行号1)},若在堆表中的{数据块1行号1}没有获取到该车牌1所属的数据(即该车牌1的第一条指引记录中的存储位置对应的数据已失效),则接着获取叶子节点1中的车牌1的第二条指引记录{指引记录2:(车牌1、数据块2行号1)},若基于该指引记录2中的存储位置能够对应在堆表中获取到车牌1所述的数据,则将该数据中的稀疏列的值(车牌1)加入唯一值集合中;若基于车牌1的第二条指引记录中的存储位置在堆表中不能获取到对应的车牌1所属的数据,则继续在叶子节点1中查找车牌1的下一条指引记录(第三条指引记录、第四条指引记录……),在上述当前叶子节点1或后续叶子节点(叶子节点2……),直至获取到车牌1在堆表中所属的数据,并将获取到的所述数据中的稀疏列的值加入唯一值集合,或直至查询到下一条指引记录中的稀疏列的值(车牌2或车牌3或车牌4或车牌5或车牌6)不同于当前待查询的稀疏列的值(车牌1);然后返回根节点,将车牌2作为当前待查询的稀疏列的值,直至获取到该待查询的稀疏列的值的唯一值集合{车牌1、车牌2、车牌3、车牌4、车牌5及车牌6}。

下面以根据索引树中的根节点中记录的其所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最大值为例,对所述步骤s21和步骤s22进行举例说明。

在本申请一实施例中,如图6所示,索引树中的上层节点(根节点)中记录的是该上层节点所包含的叶子节点及其叶子节点中的指引记录的稀疏列的值的最大值,即根节点中的记录为{(车牌1:叶子节点1)、(车牌2:叶子节点2)、(车牌3:叶子节点3)和(车牌5:叶子节点5)};所述步骤s21根据上层节点(根节点)中记录的稀疏列的值的所有最大值中的最大值(车牌6)开始,按照从大到小的顺序,依次将叶子节点中的指引记录的稀疏列的值:车牌6、车牌5、车牌4、车牌3、车牌2及车牌1作为当前待查询的稀疏列的值,当在所述步骤s22中将车牌6作为当前待查询的稀疏列的值时,基于根节点中记录的车牌6对应的叶子节点4,在叶子节点4中查找包含有车牌6的第一条指引记录,得到{指引记录15:(车牌6、数据块2行号3)},然后基于该指引记录15中的存储位置{数据块2行号3}在堆表中获取该车牌6所属的数据,若在堆表中的{数据块2行号3}获取到该车牌6所属的数据,则将该数据中的稀疏列的值(车牌6)加入唯一值集合中;然后返回根节点将车牌5作为当前待查询的稀疏列的值,重复上述步骤,直至在堆表中的存储位置获取到车牌1所属的数据,即索引树中获取不到比车牌1更小的当前待查询的稀疏列的值为止,实现了对待查询的稀疏列的值的快速获取。

接着本申请的上述实施例,在图6中,所述步骤s21根据上层节点(根节点)中记录的稀疏列的值的所有最大值中的最大值(车牌6)开始,按照从大到小的顺序,依次将叶子节点中的指引记录的稀疏列的值:车牌6、车牌5、车牌4、车牌3、车牌2及车牌1作为当前待查询的稀疏列的值;在第一次将车牌6作为当前待查询的稀疏列的值时,在叶子节点4中查找包含有车牌6的第一条指引记录{指引记录15:(车牌6、数据块2行号3)},若在堆表中的{数据块2行号3}没有获取到该车牌6所属的数据(即该车牌6的第一条指引记录中的存储位置对应的数据已失效),则接着获取叶子节点4中的车牌6的第二条指引记录{指引记录16:(车牌6、数据块4行号4)},若基于该指引记录16中的存储位置能够对应在堆表中获取到车牌6所述的数据,则将该数据中的稀疏列的值(车牌6)加入唯一值集合中;若基于车牌6的第二条指引记录中的存储位置在堆表中不能获取到对应的车牌6所属的数据,则继续在叶子节点4中查找车牌6的下一条指引记录,在上述当前叶子节点6或后续叶子节点(叶子节点5……),直至获取到车牌6在堆表中所属的数据,并将获取到的所述数据中的稀疏列的值加入唯一值集合,或直至查询到下一条指引记录中的稀疏列的值(车牌5或车牌4或车牌3或车牌2或车牌1)不同于当前待查询的稀疏列的值(车牌6);然后返回根节点,将车牌5作为当前待查询的稀疏列的值,直至获取到该待查询的稀疏列的值的唯一值集合{车牌1、车牌2、车牌3、车牌4、车牌5及车牌6}。

进一步地,所述上层节点包括所述叶子节点的上一层分支节点和所述分支节点的上一层根节点,

所述步骤s21根据索引树中的上层节点中记录的该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值,包括:

先根据根节点记录的其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值;

再根据所述叶子节点的上一层的分支节点中记录的其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值。

下面选择以所述最值为最小值为例,对所述步骤s21进行详细地实施例解释。即在本申请的一实施例中,如图4所示,在堆表中记录有n×n×n条数据,在元数据节点(metapage)中预设该索引树包括根节点(rootpage)、一层分支节点(branchpage)和叶子节点(leafpage),其中,预设单个节点可以存储n条指引记录,则此处的索引树可以存储n×n×n条指引记录,预设有n个分支节点,每个分支节点下包括有n个叶子节点,及每个叶子节点对应的可以最多存储n条指引记录,得到将稀疏列(车辆的车牌)从车牌1开始,将所有车牌在堆表中的出勤记录按照车牌的顺序及车牌对应的出勤顺序,依次将各车牌的各数据的存储位置分别写入各叶子节点中。

接着本申请的上述实施例,在图7中以稀疏列(车辆的车牌)为例,开始查找稀疏列的唯一值集合,首先扫描图7中的灰色部分,通过元数据节点查找到稀疏列(车辆的车牌)的索引树的中的根节点,接着,从稀疏列(车辆的车牌)的最小值开始,即车牌1开始,扫描根节点,通过根节点中记录的车牌1及其对应的分支节点1,再扫描分支节点1,根据分支节点1中记录的车牌1及其对应的叶子节点1,然后扫描叶子节点1,在叶子节点1中根据车牌1对应的指引记录,逐一根据叶子节点1中的指引记录中的存储位置在堆表中查找与车牌1对应的数据,如堆表中的灰色部分的数据,查找到叶子节点1中的指引记录中的存储位置对应在堆表中的数据,得到稀疏列(车辆的车牌)的最小值车牌1;然后,返回根节点中,按照车牌从小到大的顺序,接着查找车牌2对应的在堆表中的数据,即按照图8所示的灰色部分,先扫描根节点,通过根节点中记录的车牌2及其对应的分支节点2,在扫描分支节点2,根据分支节点2中记录的车牌1及其对应的叶子节点n+1和车牌2及其对应的叶子节点n+2,由于本申请当前实施例中是分支节点记录叶子节点中的稀疏列的最小值,车牌1只是叶子节点n+1中的最小值,并不代表叶子节点n+1中不存在包含有车牌2的指引记录,故在扫描完分支节点2之后,接着先扫描的是叶子节点n+1,在叶子节点n+1中扫描到包含有车牌2的多个指引记录,按照车牌的出勤顺序,逐条的将包含有车牌2的指引记录中的存储位置在堆表中查找对应有效的数据,如图8所示在堆表中的灰色条的数据找到车牌2对应的有效的数据,得到稀疏列(车辆的车牌)的值车牌2,按照车牌号从小到大的顺序,基于上述的查找循环步骤,分别得到稀疏列(车辆的车牌)的值的集合,即唯一值集合{车牌1、车牌2、……、车牌n},通过索引树中的车牌的逐层筛选来确定要查询的叶子节点,进而能够在快速地获取到当前待查询的稀疏列的值并获取到所属的数据的同时,减少索引树中的分支节点和叶子节点的扫描,进而减少查找的工作量,提高了快速获取稀疏列的唯一值的工作效率,实现快速查找到该稀疏列的唯一值。

进一步地,所述上层节点包括根节点,处于所述根节点和叶子节点之间的多层分支节点,

所述步骤s21根据索引树中的上层节点中记录的该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值,包括:

先根据根节点记录的其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值;

再根据分支节点中记录该分支节点所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值;

最后根据分支节点中记录其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值。

下面选择以所述最值为最小值且所述分支节点的层数为2层为例,对所述步骤s21进行详细地实施例解释。即在本申请的一实施例中,在堆表中记录有n×n×n×n条数据,在元数据节点(metapage)中预设该索引树包括根节点(rootpage)、第一层分支节点(firstbranchpage)、第二层分支节点(secondbranchpage)和叶子节点(leafpage),其中,预设单个节点可以存储n条指引记录,则此处的索引树可以存储n×n×n×n条指引记录,预设每层的分支节点有n个,每个分支节点下包括有n个叶子节点,及每个叶子节点对应的可以最多存储n条指引记录,得到将稀疏列(车辆的车牌)从车牌1开始依次将各车牌的各数据中包含存储位置的指引记录分别写入各叶子节点中。

接着本申请的上述实施例,在以稀疏列(车辆的车牌)为例,开始查找稀疏列的唯一值集合,首先扫描图7中的灰色部分,通过元数据节点查找到稀疏列(车辆的车牌)的索引树中的根节点,接着,从稀疏列(车辆的车牌)的最小值开始,即车牌1开始,扫描根节点,通过根节点中记录的车牌1及其对应的第一分支节点1,再扫描第一分支节点1,根据第一分支节点1中记录的车牌1及其对应的第二分支节点1,然后扫描第二分支节点1,得到第二分支节点1中记录的车牌1及其对应的叶子节点1,最后扫描叶子节点1,在叶子节点1中根据车牌1对应的指引记录,逐一根据叶子节点1中的指引记录中的存储位置在堆表中查找与车牌1对应的数据,若在堆表中获取到叶子节点1中的包含有车牌1的指引记录中的存储位置对应的数据,则得到稀疏列(车辆的车牌)的最小值车牌1;然后,返回根节点中,按照车牌从小到大的顺序,接着基于上述的查找步骤,查找车牌2、车牌3、……、车牌n分别对应的在堆表中的数据,即得到稀疏列(车辆的车牌)的值的集合,即唯一值集合{车牌1、车牌2、……、车牌n},通过索引树中的车牌的逐层筛选来确定要查询的叶子节点,进而能够在快速地获取到当前待查询的稀疏列的值并获取到所属的数据的同时,减少索引树中的分支节点和叶子节点的扫描,进而减少查找的工作量,提高了快速获取稀疏列的唯一值的工作效率,实现快速查找到该稀疏列的唯一值。

图9示出根据本申请一个方面的一种含有稀疏列的数据的存储设备,应用于数据库对应的服务器端,该设备包括获取装置11、存储装置12和记录装置13,其中,首先获取数据库中的堆表中记录的所有数据,在所述获取装置11中获取各数据的存储位置和对应的该数据中的稀疏列的值,并将每一条记录的数据的存储位置和对应的该数据中的稀疏列的值作为一条指引记录,得到各数据的存储位置与其对应的数据中的稀疏列的值的指引记录,所述存储装置12用于将所有的指引记录按照所述稀疏列的值从小到大的顺序,依次存入索引树的各连续的叶子节点(leafpage)(例如,叶子节点1、叶子节点2、叶子节点3、……、叶子节点m);最所述记录装置13用于在各叶子节点对应的上层节点中记录该上层节点所包含的叶子节点及其该叶子节点中指引记录的稀疏列的值的最值(例如,在叶子节点1的上层节点中记录上层节点所包含的叶子节点1、2、……、m及叶子节点1中所有的指引记录的稀疏列的值的最值、叶子节点2中所有的指引记录的稀疏列的值的最值、……及叶子节点m中所有的指引记录的稀疏列的值的最值),不仅实现了对稀疏列创建索引树,以便后续快速地获取到需统计稀疏列的值的唯一值,还将堆表中的稀疏列的值及其所属的所述数据的存储位置作为指引记录写入个索引树的各连续的叶子节点中,以便后续从叶子节点中的指引记录中的存储位置找到该稀疏列的值所属的数据。

本申请的索引树还包括元数据节点,其中,所述元数据节点(metapage)中存储的是索引树中的根节点(rootpage)在索引树中的具体位置,以便更快地查找到该索引树下的根节点,同时,在创建索引树之前,该元数据节点还预置需创建的索引的层数和对应各层节点的节点数预置及节点对应的记录结果的数量预置,例如,在元数据节点中预置创建的索引树包括根节点和叶子节点,包括4个叶子节点且每个叶子节点最多存储4条指引记录,进而实现对索引树的管理。

需要说明的是,所述数据是存在数据库中的堆表中的,其中堆表中的数据是是没有存储顺序的,在堆表中以数据块为单位在文件末尾处追加存储空间,每个数据块中可以记录至少一条数据,随着堆表中的数据的不断更新、删除等,一些数据块会释放存储空间,则新插入的需要记录的数据则随机地在有空余存储空间的堆表对应数据块中进行存储。

本申请实施例中的所述叶子节点是所述索引树的最底层,其中该叶子节点中不仅存储了堆表中的数据的存储位置rowid(例如在堆表中的数据块id+行号),还存储了该数据中的指引记录中的稀疏列的值,例如叶子节点1中包括稀疏列1、稀疏列2,则有叶子节点中的指引记录为{(指引记录1:稀疏列1的value1,存储位置rowid1)、(指引记录2:稀疏列2的value1,存储位置rowid3)及(指引记录3:稀疏列1的value2,存储位置rowid2)}。

进一步地,所述记录装置13用于:在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最大值或最小值。例如,若稀疏列为车辆的车牌,有两个叶子节点分别为叶子节点1和叶子节点2,其中,叶子节点1包括的指引记录为{指引记录1(车牌1,存储位置rowid1)和指引记录1(车牌2,存储位置rowid9)},叶子节点2包括的指引记录为{指引记录1(车牌3,存储位置rowid14)和指引记录1(车牌4,存储位置rowid23)},则有在叶子节点的上层节点中记录叶子节点1及其中指引记录的车牌的值的最小值:车牌1和叶子节点2及其中指引记录的车牌的值的最小值:车牌3;或在叶子节点的上层节点中记录叶子节点2及其中指引记录的车牌的值的最大值:车牌2和叶子节点2及其中指引记录的车牌的值的最大值:车牌4,实现了将各个叶子节点中记录的所有指引记录中的稀疏列的值中的最值提取到上层节点中,以便后续基于稀疏列的值的最值和对应的叶子节点来查找到该稀疏列的值所属的数据,进而能够快速地获取到稀疏列的唯一值。

进一步地,当堆表中记录的数据较少时,所述索引树包含的上层节点为所述叶子节点的上一层根节点,即该索引树的最上层为根节点,该索引树还包括最下层的叶子节点,即在堆表中记录的数据较少时,所述索引树包括根节点和叶子节点;接着所述记录装置13用于:在所述根节点中记录其所包含的叶子节点及该叶子节点中的指引记录中的稀疏列的值的最值。

在本申请一实施例中,如图2所示,堆表中记录有16条数据,将每一数据的存储位置及其中的稀疏列的值作指引记录分别存储于索引树中的叶子节点1、叶子节点2、叶子节点3和叶子节点4中,则有叶子节点1写入的有:{指引记录1:(车牌1、数据块1行号1)、指引记录2:(车牌1、数据块2行号1)、指引记录3:(车牌1、数据块3行号1)和指引记录4:(车牌2、数据块1行号2)},叶子节点2中写入的有:{指引记录5:(车牌2、数据块1行号3)、指引记录6:(车牌2、数据块3行号2)、指引记录7:(车牌3、数据块2行号4)和指引记录8:(车牌3、数据块3行号3)},叶子节点3中写入的有:{指引记录9:(车牌3、数据块4行号1)、指引记录10:(车牌4、数据块1行号4)、指引记录11:(车牌4、数据块3行号4)和指引记录12:(车牌4、数据块4行号3)},以及叶子节点4中写入的有:{指引记录13:(车牌5、数据块2行号3)、指引记录14:(车牌5、数据块4行号2)、指引记录15:(车牌6、数据块2行号2)和指引记录16:(车牌6、数据块4行号4)},接着所述记录装置13在所述根节点中记录其所包含的叶子节点1至叶子节点4及各叶子节点中的指引记录中的稀疏列的值的最小值,则有根节点中的记录为{(车牌1:叶子节点1)、(车牌2:叶子节点2)、(车牌3:叶子节点3)和(车牌5:叶子节点5)},实现了将堆表中的含有稀疏列的所有数据的指引记录写入各连续的叶子节点中,并实现了将每一叶子节点中的指引记录的稀疏列的值中的最小值及其所在的叶子节点存入根节点中,以便后续基于记录的稀疏列的值中的最小值及其所在的叶子节点快速地获取待查询的稀疏列的值及其对应的在堆表中记录的有效的数据,进而减少查找工作量并提高查找的工作效率。

在本申请的另一实施例中,如图3所示,若堆表中记录有16条数据,将每一数据的存储位置及其中的稀疏列的值作指引记录分别存储于索引树中的叶子节点1、叶子节点2、叶子节点3和叶子节点4中,则有叶子节点1写入的有:{指引记录1:(车牌1、数据块1行号1)、指引记录2:(车牌1、数据块2行号1)、指引记录3:(车牌1、数据块3行号1)和指引记录4:(车牌2、数据块1行号2)},叶子节点2中写入的有:{指引记录5:(车牌2、数据块1行号3)、指引记录6:(车牌2、数据块3行号2)、指引记录7:(车牌3、数据块2行号4)和指引记录8:(车牌3、数据块3行号3)},叶子节点3中写入的有:{指引记录9:(车牌3、数据块4行号1)、指引记录10:(车牌4、数据块1行号4)、指引记录11:(车牌4、数据块3行号4)和指引记录12:(车牌4、数据块4行号3)},以及叶子节点4中写入的有:{指引记录13:(车牌5、数据块2行号3)、指引记录14:(车牌5、数据块4行号2)、指引记录15:(车牌6、数据块2行号2)和指引记录16:(车牌6、数据块4行号4)},接着所述记录装置13在所述根节点中记录其所包含的叶子节点1至叶子节点4及各叶子节点中的指引记录中的稀疏列的值的最大值,则有根节点中的记录为{(车牌2:叶子节点1)、(车牌3:叶子节点2)、(车牌4:叶子节点3)和(车牌6:叶子节点4)},实现了将堆表中的含有稀疏列的所有数据的指引记录写入各连续的叶子节点中,并实现了将每一叶子节点中的指引记录的稀疏列的值中的最大值及其所在的叶子节点存入根节点中,以便后续基于记录的稀疏列的值中的最大值及其所在的叶子节点快速地获取待查询的稀疏列的值及其对应的在堆表中记录的有效的数据,进而减少查找工作量并提高查找的工作效率。

进一步地,当堆表中记录的数据较多时,所述索引树包含的上层节点包括所述叶子节点的上一层分支节点和所述分支节点的上一层根节点,即该索引树的最上层为根节点,中间层为一层分支节点,该索引树还包括最下层的叶子节点,即在堆表中记录的数据较多时,所述索引树包括根节点、一层分支节点以及叶子节点;接着所述记录装置13用于:

在所述叶子节点的上一层的分支节点中记录其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值;

在根节点记录其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值。

下面选择以所述最值为最小值为例,对所述记录装置13进行详细地实施例解释。即在本申请的一实施例中,如图4所示,在堆表中记录有n×n×n条数据,在元数据节点(metapage)中预设该索引树包括根节点(rootpage)、一层分支节点(branchpage)和叶子节点(leafpage),其中,预设单个节点可以存储n条指引记录,则此处的索引树可以存储n×n×n条指引记录,预设有n个分支节点,每个分支节点下包括有n个叶子节点,及每个叶子节点对应的可以最多存储n条指引记录,得到将稀疏列(车辆的车牌)从车牌1开始,将车牌1在堆表中的出勤记录按照出勤顺序,依次将各数据的存储位置与其对应的车牌1的指引记录写入分支叶子节点1,待叶子及节点1写完n条数据后,将依次将车牌1对应的指引记录写入叶子节点2中,写完车牌1对应在堆表中记录的数据后,接着将与车牌2对应的指引记录按出勤顺序写入叶子节点2及后续的叶子节点中,如此,将1000个车牌对应的在堆表中的出勤记录的数据均以指引的形式写入各连续的叶子节点中;接着所述记录装置13在叶子节点的上一层的分支节点中记录其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最小值,如图4中的分支节点1中记录有稀疏列的最小值车牌1及对应的叶子节点1、车牌1及对应的叶子节点2、车牌1及对应的叶子节点3、……、以及车牌1及对应的叶子节点n;分支节点2中记录有稀疏列的最小值车牌1及其对应的叶子节点n+1、车牌2及其对应的叶子节点n+2、车牌2及其对应的叶子节点n+3、……、车牌2及其对应的叶子节点m,……,依次将各个叶子节点中指引记录的稀疏列(车辆的车牌)的值的最小值及对应的叶子节点作为一条记录对应的写入对应的上一层的分支节点;接着,在根节点记录其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最小值,如图4中的根节点中记录有各分支节点的最小值及其对应的分支节点:车牌1:分支节点1,车牌1:分支节点2,车牌3:分支节点3,……,车牌1000:分支节点n,实现了将堆表中记录的较多的数据的情况下的所有的数据以指引记录的形式分别映射写入至索引树中的各连续的叶子节点中,并实现了将每一叶子节点中的指引记录的稀疏列的值中的最小值及其所在的叶子节点存入对应的分支节点中,并将各分支节点中的稀疏列的值中的最小值及其对应的分支节点作为一条记录写入对应的根节点中,以便后续基于根节点中记录的稀疏列的值中的最小值及其所在的分支节点和对应下一层的分支节点记录的稀疏列的最小值及其对应的叶子节点,进而快速地获取待查询的稀疏列的值及其对应的在堆表中记录的有效的数据,进而减少查找工作量并提高查找的工作效率。

进一步地,当堆表中记录的数据很多时,所述索引树包含的上层节点包括根节点,处于所述根节点和叶子节点之间的多层分支节点,该索引树还包括最下层的叶子节点,即在堆表中记录的数据很多时,所述索引树包括根节点、多层分支节点以及叶子节点;接着所述记录装置13用于:

在分支节点中记录其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值,或在分支节点中记录其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值;

在根节点记录其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值。

下面选择以所述最值为最小值且所述分支节点的层数为2层为例,对所述记录装置13进行详细地实施例解释。即在本申请的一实施例中,在堆表中记录有n×n×n×n条数据,在元数据节点(metapage)中预设该索引树包括根节点(rootpage)、第一层分支节点(firstbranchpage)、第二层分支节点(secondbranchpage)和叶子节点(leafpage),其中,预设单个节点可以存储n条指引记录,则此处的索引树可以存储n×n×n×n条指引记录,预设每层的分支节点有n个,每个分支节点下包括有n个叶子节点,及每个叶子节点对应的可以最多存储n条指引记录,得到将稀疏列(车辆的车牌)从车牌1开始,将车牌1在堆表中的出勤记录按照出勤顺序,依次将各数据的存储位置与其对应的车牌1的指引记录写入分支叶子节点1,待叶子及节点1写完n条数据后,将依次将车牌1对应的指引记录写入叶子节点2中,写完车牌1对应在堆表中记录的数据后,接着将与车牌2对应的指引记录按出勤顺序写入叶子节点2及后续的叶子节点中,如此,将1000个车牌对应的在堆表中的出勤记录的数据均以指引的形式写入各连续的叶子节点中;接着所述记录装置13在叶子节点的上一层的分支节点中记录其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最小值,在第二层分支节点1中记录有稀疏列的最小值车牌1及对应的叶子节点1、车牌1及对应的叶子节点2、车牌1及对应的叶子节点3、……、以及车牌1及对应的叶子节点n;第二层分支节点2中记录有稀疏列的最小值车牌1及其对应的叶子节点n+1、车牌2及其对应的叶子节点n+2、车牌2及其对应的叶子节点n+3、……、车牌2及其对应的叶子节点m,……,依次将各个叶子节点中指引记录的稀疏列(车辆的车牌)的值的最小值及对应的叶子节点作为一条记录对应的写入对应的上一层的第二层分支节点;接着,在第一层分支节点1中记录对应下层的各第二层分支节点及其对应的稀疏列(车牌)的最小值;接着,在根节点记录其所包含的第一层分支节点及该第一层分支节点中的稀疏列的值的最小值,在根节点中记录有各第一层分支节点的最小值及其对应的第一层分支节点:车牌1:第一层分支节点1,车牌1:第一层分支节点2,车牌3:第一层分支节点3,……,车牌1000:第一层分支节点n,实现了将堆表中记录的较多的数据的情况下的所有的数据以指引记录的形式分别映射写入至索引树中的各连续的叶子节点中,并实现了将每一叶子节点中的指引记录的稀疏列的值中的最小值及其所在的叶子节点存入对应的第二层分支节点中,并将各第二层分支节点中的稀疏列的值中的最小值及其对应的第二层分支节点作为一条记录写入对应的第一层分支节点中,最后将第一层分支节点中的稀疏列的值中的最小值及其对应的第一层分支节点作为一条记录写入对应的根节点中,以便后续基于根节点中记录的稀疏列的值中的最小值及其所在的分支节点和对应下一层的第一层分支节点记录的稀疏列的最小值及其对应的第二层分支节点和对应的下一层的第二层分支节点记录的稀疏列的最小值及其对应的叶子节点,进而快速地获取待查询的稀疏列的值及其对应的在堆表中记录的有效的数据,进而减少查找工作量并提高查找的工作效率。

图10示出根据本申请另一个方面的一种查询唯一值的设备,应用于数据库对应的服务器端,该设备包括确定查找装置21和唯一值统计装置22,其中,该方法通过已创建好的索引树,所述确定查找装置21用于根据索引树中的上层节点中记录的该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值,确定当前待查询的稀疏列的值;接着,所述确定查找装置21用于在所述叶子节点中依次查找当前待查询的稀疏列的值所属的第一条指引记录,其中,所述指引记录包括数据的存储位置和对应的所述数据中的稀疏列的值,所述指引记录按照所述稀疏列的值从小到大的顺序,依次存于索引树的各连续的叶子节点;最后,唯一值统计装置22用于根据查找到的第一条指引记录中数据的存储位置获取所述数据,将获取到的所述数据中的稀疏列的值加入唯一值集合,实现了基于该索引树,完成对待查询的稀疏列的值的唯一值的快速获取,避免了对索引树中的全部叶子节点进行扫描,也避免了扫描所有叶子节点中的指引记录对应的数据的存储位置的扫描,只要获取到待查询的稀疏列的值对应的第一条指引记录在堆表中对应的数据时,则可返回至上层节点,继续查找待查询的稀疏列的值的下一值,此种查找方式不仅减少了扫描索引树的工作量,还大大提升了查找待查询的稀疏列的值的唯一值的工作效率。

进一步地,所述唯一值统计装置22还用于:

若未获取到,在当前查询的叶子节点或后续叶节点依次查找当前待查询的稀疏列的值所属的下一条指引记录;

根据查找到的下一条指引记录中的数据的存储位置获取所述数据,若获取到,将所述含有稀疏列的值加入唯一值集合,若未获取,重复上述步骤直至获取所述数据,则将获取到的所述数据中的稀疏列的值加入唯一值集合,或直至查询到的下一条指引记录中的稀疏列的值不同于当前待查询的稀疏列的值。

本申请一实施例中,若在所述确定查找装置21中查找当前待查询稀疏列的值(车牌1)所属的第一条指引记录的时候,所述唯一值统计装置22根据在叶子节点中查找到的当前待查询稀疏列的值(车牌1)所属的第一条指引记录中的存储位置,在堆表中获取到对应的所述数据,则将该获取到的数据中的稀疏列的值加入唯一值集合{车牌1};若在所述唯一值统计装置22中根据在叶子节点中查找到的当前待查询稀疏列的值(车牌1)所属的第一条指引记录中的存储位置,未在堆表中获取到对应的数据,则在当前查询的叶子节点(例如,当前待查询稀疏列的值(车牌1)所属的下一条指引记录和当前待查询稀疏列的值(车牌1)所属的第一条指引记录处于同一个叶子节点中)或后续叶节点(例如,当前待查询稀疏列的值(车牌1)所属的下一条指引记录和当前待查询稀疏列的值(车牌1)所属的第一条指引记录处于相邻的不同叶子节点中)依次查找当前待查询的稀疏列的值所属的下一条指引记录。

接着本申请的上述实施例,在根据查询当前待查询稀疏列的值(车牌1)所属的第一条指引记录来在堆表中获取对应的数据失败后,接着根据查找到的下一条指引记录中的数据的存储位置在堆表中获取所述数据,若获取到,将所述含有稀疏列的值加入唯一值集合{车牌1},若未获取到的话,则重复上述依次查询当前待查询稀疏列的值(车牌1)所属的下一条指引记录的步骤,直至在堆表中获取到对应的所述数据(例如,当前待查询稀疏列的值(车牌1)所属的前几条指引记录中的数据的存储位置对应在堆表中不存在对应的数据,即数据已失效,而在当前待查询稀疏列的值(车牌1)所属的后续的某一条指引记录中的数据的存储位置对应在堆表中的数据有效地存在),则将获取到的所述数据中的稀疏列的值加入唯一值集合{车牌1},通过上述重复循环地步骤,减少了对上层节点及其对应的叶子节点的扫描,进而大大降低了查找待查询的稀疏列的值的唯一值的工作量,还提高了查找的工作效率。

进一步地,若索引树中的上层节点中记录的是该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最小值,

所述确定查找装置21用于:

由上层节点所包含的叶子节点中的指引记录的稀疏列的值的所有最小值中的最小值开始,按从小到大的顺序,依次将叶子节点中的指引记录的稀疏列的值作为当前待查询的稀疏列的值。

在本申请一实施例中,如图5所示,索引树中的上层节点(根节点)中记录的是该上层节点所包含的叶子节点及其叶子节点中的指引记录的稀疏列的值的最小值,即根节点中的记录为{(车牌1:叶子节点1)、(车牌2:叶子节点2)、(车牌3:叶子节点3)和(车牌5:叶子节点5)};所述确定查找装置21根据上层节点(根节点)中记录的稀疏列的值的所有最小值中的最小值(车牌1)开始,扫描图5中的灰色部分,得到稀疏列的值车牌1,然后按照从小到大的顺序,依次将叶子节点中的指引记录的稀疏列的值:车牌2、车牌3、车牌4、车牌5及车牌6作为当前待查询的稀疏列的值,实现将待查询的稀疏列的值的索引,进而使得获取的待查询的稀疏列的值的唯一值集合更加精确。

进一步地,若索引树中的上层节点中记录的是该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最大值,

所述确定查找装置21用于:

由上层节点所包含的叶子节点中的指引记录的稀疏列的值的所有最大值中的最大值开始,按从大到小的顺序,依次将叶子节点中的指引记录的稀疏列的值作为当前待查询的稀疏列的值。

在本申请一实施例中,如图6所示,索引树中的上层节点(根节点)中记录的是该上层节点所包含的叶子节点及其叶子节点中的指引记录的稀疏列的值的最大值,即根节点中的记录为{(车牌1:叶子节点1)、(车牌2:叶子节点2)、(车牌3:叶子节点3)和(车牌5:叶子节点5)};所述确定查找装置21根据上层节点(根节点)中记录的稀疏列的值的所有最大值中的最大值(车牌6)开始,扫描图6中的灰色部分,得到待查询的稀疏列的值车牌6,然后按照从大到小的顺序,依次将叶子节点中的指引记录的稀疏列的值:车牌6、车牌5、车牌4、车牌3及车牌2作为当前待查询的稀疏列的值,实现将待查询的稀疏列的值的索引,进而使得获取的待查询的稀疏列的值的唯一值集合更加精确。

进一步地,所述上层节点包括所述叶子节点的上一层根节点,

所述确定查找装置21用于:

根据索引树中的根节点中记录的其所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值。

下面以根据索引树中的根节点中记录的其所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最小值为例,对所述确定查找装置21和唯一值统计装置22的具体执行过程进行举例说明。

在本申请一实施例中,如图5所示,索引树中的上层节点(根节点)中记录的是该上层节点所包含的叶子节点及其叶子节点中的指引记录的稀疏列的值的最小值,即根节点中的记录为{(车牌1:叶子节点1)、(车牌2:叶子节点2)、(车牌3:叶子节点3)和(车牌5:叶子节点5)};所述确定查找装置21根据上层节点(根节点)中记录的稀疏列的值的所有最小值中的最小值(车牌1)开始,按照从小到大的顺序,依次将叶子节点中的指引记录的稀疏列的值:车牌1、车牌2、车牌3、车牌4、车牌5及车牌6作为当前待查询的稀疏列的值。当在所述唯一值统计装置22中将车牌1作为当前待查询的稀疏列的值时,基于根节点中记录的车牌1对应的叶子节点1,在叶子节点1中查找包含有车牌1的第一条指引记录,得到{指引记录1:(车牌1、数据块1行号1)},然后基于该指引记录1中的存储位置{数据块1行号1}在堆表中获取该车牌1所属的数据,若在堆表中的{数据块1行号1}获取到该车牌1所属的数据,则将该数据中的稀疏列的值(车牌1)加入唯一值集合中;然后返回根节点将车牌2作为当前待查询的稀疏列的值,重复上述步骤,直至在堆表中的存储位置获取到车牌6所属的数据,即索引树中获取不到比车牌6更大的当前待查询的稀疏列的值为止,实现了对待查询的稀疏列的值的快速获取。

接着本申请的上述实施例,在图5中,所述确定查找装置21根据上层节点(根节点)中记录的稀疏列的值的所有最小值中的最小值(车牌1)开始,按照从小到大的顺序,依次将叶子节点中的指引记录的稀疏列的值:车牌1、车牌2、车牌3、车牌4、车牌5及车牌6作为当前待查询的稀疏列的值;在第一次将车牌1作为当前待查询的稀疏列的值时,在叶子节点1中查找包含有车牌1的第一条指引记录{指引记录1:(车牌1、数据块1行号1)},若在堆表中的{数据块1行号1}没有获取到该车牌1所属的数据(即该车牌1的第一条指引记录中的存储位置对应的数据已失效),则接着获取叶子节点1中的车牌1的第二条指引记录{指引记录2:(车牌1、数据块2行号1)},若基于该指引记录2中的存储位置能够对应在堆表中获取到车牌1所述的数据,则将该数据中的稀疏列的值(车牌1)加入唯一值集合中;若基于车牌1的第二条指引记录中的存储位置在堆表中不能获取到对应的车牌1所属的数据,则继续在叶子节点1中查找车牌1的下一条指引记录(第三条指引记录、第四条指引记录……),在上述当前叶子节点1或后续叶子节点(叶子节点2……),直至获取到车牌1在堆表中所属的数据,并将获取到的所述数据中的稀疏列的值加入唯一值集合,或直至查询到下一条指引记录中的稀疏列的值(车牌2或车牌3或车牌4或车牌5或车牌6)不同于当前待查询的稀疏列的值(车牌1);然后返回根节点,将车牌2作为当前待查询的稀疏列的值,直至获取到该待查询的稀疏列的值的唯一值集合{车牌1、车牌2、车牌3、车牌4、车牌5及车牌6}。

下面以根据索引树中的根节点中记录的其所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最大值为例,对所述确定查找装置21和唯一值统计装置22的具体执行过程进行举例说明。

在本申请一实施例中,如图6所示,索引树中的上层节点(根节点)中记录的是该上层节点所包含的叶子节点及其叶子节点中的指引记录的稀疏列的值的最大值,即根节点中的记录为{(车牌1:叶子节点1)、(车牌2:叶子节点2)、(车牌3:叶子节点3)和(车牌5:叶子节点5)};所述确定查找装置21根据上层节点(根节点)中记录的稀疏列的值的所有最大值中的最大值(车牌6)开始,按照从大到小的顺序,依次将叶子节点中的指引记录的稀疏列的值:车牌6、车牌5、车牌4、车牌3、车牌2及车牌1作为当前待查询的稀疏列的值,当在所述唯一值统计装置22中将车牌6作为当前待查询的稀疏列的值时,基于根节点中记录的车牌6对应的叶子节点4,在叶子节点4中查找包含有车牌6的第一条指引记录,得到{指引记录15:(车牌6、数据块2行号3)},然后基于该指引记录15中的存储位置{数据块2行号3}在堆表中获取该车牌6所属的数据,若在堆表中的{数据块2行号3}获取到该车牌6所属的数据,则将该数据中的稀疏列的值(车牌6)加入唯一值集合中;然后返回根节点将车牌5作为当前待查询的稀疏列的值,重复上述步骤,直至在堆表中的存储位置获取到车牌1所属的数据,即索引树中获取不到比车牌1更小的当前待查询的稀疏列的值为止,实现了对待查询的稀疏列的值的快速获取。

接着本申请的上述实施例,在图6中,所述确定查找装置21根据上层节点(根节点)中记录的稀疏列的值的所有最大值中的最大值(车牌6)开始,按照从大到小的顺序,依次将叶子节点中的指引记录的稀疏列的值:车牌6、车牌5、车牌4、车牌3、车牌2及车牌1作为当前待查询的稀疏列的值;在第一次将车牌6作为当前待查询的稀疏列的值时,在叶子节点4中查找包含有车牌6的第一条指引记录{指引记录15:(车牌6、数据块2行号3)},若在堆表中的{数据块2行号3}没有获取到该车牌6所属的数据(即该车牌6的第一条指引记录中的存储位置对应的数据已失效),则接着获取叶子节点4中的车牌6的第二条指引记录{指引记录16:(车牌6、数据块4行号4)},若基于该指引记录16中的存储位置能够对应在堆表中获取到车牌6所述的数据,则将该数据中的稀疏列的值(车牌6)加入唯一值集合中;若基于车牌6的第二条指引记录中的存储位置在堆表中不能获取到对应的车牌6所属的数据,则继续在叶子节点4中查找车牌6的下一条指引记录,在上述当前叶子节点6或后续叶子节点(叶子节点5……),直至获取到车牌6在堆表中所属的数据,并将获取到的所述数据中的稀疏列的值加入唯一值集合,或直至查询到下一条指引记录中的稀疏列的值(车牌5或车牌4或车牌3或车牌2或车牌1)不同于当前待查询的稀疏列的值(车牌6);然后返回根节点,将车牌5作为当前待查询的稀疏列的值,直至获取到该待查询的稀疏列的值的唯一值集合{车牌1、车牌2、车牌3、车牌4、车牌5及车牌6}。

进一步地,所述上层节点包括所述叶子节点的上一层分支节点和所述分支节点的上一层根节点,

所述确定查找装置21用于:

先根据根节点记录的其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值;

再根据所述叶子节点的上一层的分支节点中记录的其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值。

下面选择以所述最值为最小值为例,对所述确定查找装置21进行详细地实施例解释。即在本申请的一实施例中,如图4所示,在堆表中记录有n×n×n条数据,在元数据节点(metapage)中预设该索引树包括根节点(rootpage)、一层分支节点(branchpage)和叶子节点(leafpage),其中,预设单个节点可以存储n条指引记录,则此处的索引树可以存储n×n×n条指引记录,预设有n个分支节点,每个分支节点下包括有n个叶子节点,及每个叶子节点对应的可以最多存储n条指引记录,得到将稀疏列(车辆的车牌)从车牌1开始,将所有车牌在堆表中的出勤记录按照车牌的顺序及车牌对应的出勤顺序,依次将各车牌的各数据的存储位置分别写入各叶子节点中。

接着本申请的上述实施例,在图7中以稀疏列(车辆的车牌)为例,开始查找稀疏列的唯一值集合,首先扫描图7中的灰色部分,通过元数据节点查找到稀疏列(车辆的车牌)的索引树的中的根节点,接着,从稀疏列(车辆的车牌)的最小值开始,即车牌1开始,扫描根节点,通过根节点中记录的车牌1及其对应的分支节点1,再扫描分支节点1,根据分支节点1中记录的车牌1及其对应的叶子节点1,然后扫描叶子节点1,在叶子节点1中根据车牌1对应的指引记录,逐一根据叶子节点1中的指引记录中的存储位置在堆表中查找与车牌1对应的数据,如堆表中的灰色部分的数据,查找到叶子节点1中的指引记录中的存储位置对应在堆表中的数据,得到稀疏列(车辆的车牌)的最小值车牌1;然后,返回根节点中,按照车牌从小到大的顺序,接着查找车牌2对应的在堆表中的数据,即按照图8所示的灰色部分,先扫描根节点,通过根节点中记录的车牌2及其对应的分支节点2,在扫描分支节点2,根据分支节点2中记录的车牌1及其对应的叶子节点n+1和车牌2及其对应的叶子节点n+2,由于本申请当前实施例中是分支节点记录叶子节点中的稀疏列的最小值,车牌1只是叶子节点n+1中的最小值,并不代表叶子节点n+1中不存在包含有车牌2的指引记录,故在扫描完分支节点2之后,接着先扫描的是叶子节点n+1,在叶子节点n+1中扫描到包含有车牌2的多个指引记录,按照车牌的出勤顺序,逐条的将包含有车牌2的指引记录中的存储位置在堆表中查找对应有效的数据,如图8所示在堆表中的灰色条的数据找到车牌2对应的有效的数据,得到稀疏列(车辆的车牌)的值车牌2,按照车牌号从小到大的顺序,基于上述的查找循环步骤,分别得到稀疏列(车辆的车牌)的值的集合,即唯一值集合{车牌1、车牌2、……、车牌n},通过索引树中的车牌的逐层筛选来确定要查询的叶子节点,进而能够在快速地获取到当前待查询的稀疏列的值并获取到所属的数据的同时,减少索引树中的分支节点和叶子节点的扫描,进而减少查找的工作量,提高了快速获取稀疏列的唯一值的工作效率,实现快速查找到该稀疏列的唯一值。

进一步地,所述上层节点包括根节点,处于所述根节点和叶子节点之间的多层分支节点,

所述确定查找装置21用于:

先根据根节点记录的其所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值;

再根据分支节点中记录该分支节点所包含的下一层分支节点及该下一层分支节点中的稀疏列的值的最值;

最后根据分支节点中记录其所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值。

下面选择以所述最值为最小值且所述分支节点的层数为2层为例,对所述确定查找装置21进行详细地实施例解释。即在本申请的一实施例中,在堆表中记录有n×n×n×n条数据,在元数据节点(metapage)中预设该索引树包括根节点(rootpage)、第一层分支节点(firstbranchpage)、第二层分支节点(secondbranchpage)和叶子节点(leafpage),其中,预设单个节点可以存储n条指引记录,则此处的索引树可以存储n×n×n×n条指引记录,预设每层的分支节点有n个,每个分支节点下包括有n个叶子节点,及每个叶子节点对应的可以最多存储n条指引记录,得到将稀疏列(车辆的车牌)从车牌1开始依次将各车牌的各数据中包含存储位置的指引记录分别写入各叶子节点中。

接着本申请的上述实施例,在以稀疏列(车辆的车牌)为例,开始查找稀疏列的唯一值集合,首先扫描图7中的灰色部分,通过元数据节点查找到稀疏列(车辆的车牌)的索引树中的根节点,接着,从稀疏列(车辆的车牌)的最小值开始,即车牌1开始,扫描根节点,通过根节点中记录的车牌1及其对应的第一分支节点1,再扫描第一分支节点1,根据第一分支节点1中记录的车牌1及其对应的第二分支节点1,然后扫描第二分支节点1,得到第二分支节点1中记录的车牌1及其对应的叶子节点1,最后扫描叶子节点1,在叶子节点1中根据车牌1对应的指引记录,逐一根据叶子节点1中的指引记录中的存储位置在堆表中查找与车牌1对应的数据,若在堆表中获取到叶子节点1中的包含有车牌1的指引记录中的存储位置对应的数据,则得到稀疏列(车辆的车牌)的最小值车牌1;然后,返回根节点中,按照车牌从小到大的顺序,接着基于上述的查找步骤,查找车牌2、车牌3、……、车牌n分别对应的在堆表中的数据,即得到稀疏列(车辆的车牌)的值的集合,即唯一值集合{车牌1、车牌2、……、车牌n},通过索引树中的车牌的逐层筛选来确定要查询的叶子节点,进而能够在快速地获取到当前待查询的稀疏列的值并获取到所属的数据的同时,减少索引树中的分支节点和叶子节点的扫描,进而减少查找的工作量,提高了快速获取稀疏列的唯一值的工作效率,实现快速查找到该稀疏列的唯一值。

综上所述,本申请在提供的一种含有稀疏列的数据的存储方法中,通过先获取堆表中记录的数据的存储位置和对应的所述数据中的稀疏列的值,将该数据的存储位置和对应的所述数据中的稀疏列的值作为指引记录;按照所述稀疏列的值从大到小的顺序,将所述指引记录依次存入索引树的各连续的叶子节点中;并在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值,不仅实现了对稀疏列创建索引树,以便后续快速地获取到需统计稀疏列的值的唯一值,还将堆表中的稀疏列的值及其所属的所述数据的存储位置作为指引记录写入个索引树的各连续的叶子节点中,以便后续从叶子节点中的指引记录中的存储位置找到该稀疏列的值所属的数据。

进一步的,本申请还在提供的一种查询唯一值的方法中,通过已创建好的索引树,根据索引树中的上层节点中记录的该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值,确定当前待查询的稀疏列的值,并在所述叶子节点中依次查找当前待查询的稀疏列的值所属的第一条指引记录,其中,所述指引记录包括数据的存储位置和对应的所述数据中的稀疏列的值,所述指引记录按照所述稀疏列的值从小到大的顺序,依次存于索引树的各连续的叶子节点;并根据查找到的第一条指引记录中数据的存储位置,获取对应的所述数据,将获取到的所述数据中的稀疏列的值加入唯一值集合,实现了基于该索引树,完成对待查询的稀疏列的值的唯一值的快速获取。

本申请提供的一种应用于租车系统中的车辆出车过程中的含有稀疏列(车牌)的数据的存储方法的实际应用场景中,将创建的稀疏列的索引树中的根节点存储在元数据节点中,以便快速地找到索引树的根节点;若整租车系统中只有6辆车,整个租车系统一整天的出车数据全部随机的存储在堆表中,共有16条出车数据,将每一条出车数据的存储位置及其中的车牌的值作为指引记录分别存储于索引树中的各叶子节点中,分别为叶子节点1、叶子节点2、叶子节点3和叶子节点4,其中,叶子节点1写入的有:{指引记录1:(车牌1、数据块1行号1)、指引记录2:(车牌1、数据块2行号1)、指引记录3:(车牌1、数据块3行号1)和指引记录4:(车牌2、数据块1行号2)},叶子节点2中写入的有:{指引记录5:(车牌2、数据块1行号3)、指引记录6:(车牌2、数据块3行号2)、指引记录7:(车牌3、数据块2行号4)和指引记录8:(车牌3、数据块3行号3)},叶子节点3中写入的有:{指引记录9:(车牌3、数据块4行号1)、指引记录10:(车牌4、数据块1行号4)、指引记录11:(车牌4、数据块3行号4)和指引记录12:(车牌4、数据块4行号3)},以及叶子节点4中写入的有:{指引记录13:(车牌5、数据块2行号3)、指引记录14:(车牌5、数据块4行号2)、指引记录15:(车牌6、数据块2行号2)和指引记录16:(车牌6、数据块4行号4)},在将堆表中的所有的出车数据的存储位置及其对应的车牌作为指引记录分别存储在各叶子节点之后,由于该租车系统中包含的车辆较少(只有6辆)且出车数据较少,则对稀疏列(车牌)创建的索引树只包含根节点和叶子节点,则在所述根节点中记录其所包含的叶子节点1至叶子节点4及各叶子节点中的指引记录中的稀疏列的值的最小值,即根节点中的记录为{(车牌1:叶子节点1)、(车牌2:叶子节点2)、(车牌3:叶子节点3)和(车牌5:叶子节点5)},实现了将堆表中的含有稀疏列的所有数据的指引记录写入各连续的叶子节点中,并实现了将每一叶子节点中的指引记录的稀疏列的值中的最小值及其所在的叶子节点存入根节点中,以便后续基于记录的稀疏列的值中的最小值及其所在的叶子节点快速地获取待查询的稀疏列的值及其对应的在堆表中记录的有效的数据,进而减少查找工作量并提高查找的工作效率。

本申请提供的一种应用于租车系统中的车辆出车过程中的查询稀疏列(车牌)唯一值方法的实际应用场景中,由于将在堆表中的租车系统中的出车数据中的存储位置及其对应的车牌作为指引记录分别存储在各叶子节点中,并将各叶子节点中的车牌的最小值及其对应的当前叶子节点分别记录在根节点中,故在查询待查询的稀疏列(车牌)的唯一值时,需通过元数据节点快速地查找到索引树的根节点,接着从车牌的最小值中的最小值车牌1开始,扫描根节点{(车牌1:叶子节点1)、(车牌2:叶子节点2)、(车牌3:叶子节点3)和(车牌5:叶子节点5)},得到车牌1及其对应的叶子节点1,然后扫描叶子节点1中的所有包含车牌1的指引记录,并根据包含有车牌1的指引记录中的存储位置,在堆表中获取到包含有车牌1的出车数据,然后按照车牌从小到大的顺序继续查找车牌2、车牌3、车牌4、车牌5和车牌6分别在堆表中的出车数据,进而得到稀疏列(车牌)的值的集合,即待查询的稀疏列(车牌)的唯一值集合{车牌1、车牌2、车牌3、车牌4、车牌5和车牌6},实现了对待查询的稀疏列的值的快速准确地获取。

根据本申请的另一个方面,提供了一种基于计算的设备,包括:

处理器;以及

被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器:

获取数据的存储位置和对应的所述数据中的稀疏列的值,将数据的存储位置和对应的所述数据中的稀疏列的值作为指引记录;

按照所述稀疏列的值从小到大的顺序,将所述指引记录依次存入索引树的各连续的叶子节点;

在所述叶子节点的上层节点中记录该上层节点所包含的叶子节点及该叶子节点中指引记录的稀疏列的值的最值。

根据本申请的另一个方面,提供了一种基于计算的设备,包括:

处理器;以及

被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器:

根据索引树中的上层节点中记录的该上层节点所包含的叶子节点及该叶子节点中的指引记录的稀疏列的值的最值,确定当前待查询的稀疏列的值;

在所述叶子节点中依次查找当前待查询的稀疏列的值所属的第一条指引记录,其中,所述指引记录包括数据的存储位置和对应的所述数据中的稀疏列的值,所述指引记录按照所述稀疏列的值从小到大的顺序,依次存于索引树的各连续的叶子节点;

根据查找到的第一条指引记录中数据的存储位置获取所述数据,将获取到的所述数据中的稀疏列的值加入唯一值集合。

显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

需要注意的是,本申请可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(asic)、通用目的计算机或任何其他类似硬件设备来实现。在一个实施例中,本申请的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本申请的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,ram存储器,磁或光驱动器或软磁盘及类似设备。另外,本申请的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。

另外,本申请的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本申请的方法和/或技术方案。而调用本申请的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据所述程序指令运行的计算机设备的工作存储器中。在此,根据本申请的一个实施例包括一个装置,该装置包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该装置运行基于前述根据本申请的多个实施例的方法和/或技术方案。

对于本领域技术人员而言,显然本申请不限于上述示范性实施例的细节,而且在不背离本申请的精神或基本特征的情况下,能够以其他的具体形式实现本申请。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。装置权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。

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