一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

LSM-Tree架构数据库有序表的查询方法和装置与流程

2022-09-01 03:48:39 来源:中国专利 TAG:
lsm-tree架构数据库有序表的查询方法和装置
技术领域
:1.本说明书涉及数据处理
技术领域
:,尤其涉及一种lsm-tree(logstructuredmergetree,日志结构合并树)架构数据库有序表的查询方法和装置。
背景技术
::2.lsm-tree是一种分层、有序、面向磁盘的数据结构,其核心思想是利用磁盘批量的顺序写比随机写性能高的特性,让写性能达到最优。这种数据结构以追加模式将对数据记录的插入、删除、或更改写入一系列有序表中,大大提升了对数据库的写入能力,同时不得不牺牲部分读取性能为代价。3.在对以lsm-tree为存储架构的数据库系统进行查询时,一般需要对涉及不同层次的多张有序表按照查询条件进行扫描,再将若干张有序表的扫描结果归并后得到查询结果。扫描有序表的效率决定了查询的速度,对lsm-tree架构数据库的读取性能具有决定性的影响。技术实现要素:4.有鉴于此,本说明书提供一种lsm-tree架构数据库有序表的查询方法,所述查询包括根据查询条件依次扫描一张到多张有序表,对某一张有序表的扫描包括:5.将所述某一张有序表作为当前有序表;6.在当前迭代器匹配于当前有序表的类型时,保留当前迭代器;否则获取与当前有序表匹配类型的迭代器作为当前迭代器;7.由当前迭代器确定本次扫描的目标数据块;8.当本次扫描的目标数据块与当前缓存数据块是同一个数据块时,保留当前缓存数据块;否则读取本次扫描的目标数据块到缓存中生成新的当前缓存数据块;9.由当前迭代器根据查询条件扫描当前缓存数据块。10.本说明书还提供了一种lsm-tree架构数据库有序表的查询装置,所述查询包括根据查询条件依次扫描一张到多张有序表,所述装置中用于对某一张有序表进行扫描的部分包括:11.当前有序表单元,用于将所述某一张有序表作为当前有序表;12.当前迭代器单元,用于在当前迭代器匹配于当前有序表的类型时,保留当前迭代器;否则获取与当前有序表匹配类型的迭代器作为当前迭代器;13.目标数据块单元,用于由当前迭代器确定本次扫描的目标数据块;14.当前缓存数据块单元,用于当本次扫描的目标数据块与当前缓存数据块是同一个数据块时,保留当前缓存数据块;否则读取本次扫描的目标数据块到缓存中生成新的当前缓存数据块;15.扫描执行单元,用于由当前迭代器根据查询条件扫描当前缓存数据块。16.本说明书提供的一种计算机设备,包括:存储器和处理器;所述存储器上存储有可由处理器运行的计算机程序;所述处理器运行所述计算机程序时,执行上述lsm-tree架构数据库有序表的查询方法所述的方法。17.本说明书还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器运行时,执行上述lsm-tree架构数据库有序表的查询方法所述的方法。18.由以上技术方案可见,本说明书的实施例中,在当前迭代器能够用于本次扫描的时候保留当前迭代器,在当前缓存数据块能够用于本次扫描的时候使用当前缓存数据块来进行扫描,避免了在每次扫描时都需要重新生成迭代器以及重新生成缓存数据块,通过复用已有的资源加快了有序表的扫描速度,提升了lsm-tree架构数据库的读取性能。附图说明19.图1是本说明书实施例中一种lsm-tree架构数据库有序表的查询方法中对某一张有序表的扫描流程图;20.图2是本说明书应用示例中一种对有序表进行扫描的流程图;21.图3是运行本说明书实施例的设备的一种硬件结构图;22.图4是本说明书实施例中一种lsm-tree架构数据库有序表的查询装置的逻辑结构图。具体实施方式23.在以lsm-tree为存储架构的数据库系统中,当发生对数据的插入、删除、或更改后,这些写操作会被写入内存中的memtable(一种内存中的数据组织结构)。memtable使用树结构来保持key的有序。当memtable的大小超过阈值时,该memtable被冻结,同时为了不阻塞写操作生成一个新的memtable继续提供服务。冻结memtable中的数据会持久化在磁盘上,写成l0层的sstable(sortedstringstable)文件。24.当l0层sstable文件的体积超过一定的大小或者数量超过一定的个数,会周期性的进行合并,清除掉被标记删除掉的数据并汇总多版本的数据,生成l1层的sstable文件。类似的,当l1层sstable文件的体积过大或者数量过多,也可以周期性的进行合并,生成l2层的sstable文件。以此类推,还可以有l3层sstable文件等等。25.sstable采用持久化、有序且不可变的的键值存储结构,其数据按照key(键)排序,它的key和value(值)都可以是任意的字节数组,并且了提供了按指定key查找和指定范围的key区间迭代遍历的功能。memtable和各层sstable都采用有序结构来存储数据,均为有序表。26.有序表(memtable和sstable)内部包含了一系列数据块,通常有序表中都提供了块索引(blockindex)来定位要读取的数据块,数据块中包括若干个数据行。对一些数据库产品,如oceanbase,其有序表sstable由若干个宏块(macroblock)构成,宏块是数据文件写操作的基本单位;在宏块内部数据被组织为多个变长数据块,称之为微块(microblock),微块中包含若干数据行(row),微块是数据文件读操作的最小单位;在oceanbase的有序表中可以通过索引来查找相应的宏块和微块。27.在对有序表进行查询操作时,首先查找内存中的memtable,如果找到了符合查询条件的所有数据行,则查询结束;否则逐个查找l0层的sstable,再到l1层、l2层等等的一个到多个sstable,直到找到符合查询条件的所有数据行、或确认不存在符合查询条件的数据行后结束。28.对每个有序表的查找通常采用迭代器来进行。具体来说,为每个要查找的有序表生成一个迭代器,迭代器按照查询范围定位到可能包含待查找数据行的数据块(即该有序表的目标数据块),读取目标数据块中的数据行,在缓存中生成对应于目标数据块的缓存数据块,再按照查询条件来扫描缓存数据块。如果缓存数据块中存在符合查询条件的一个到多个数据行,则按照这些数据行生成扫描结果并返回;如果缓存数据块中不存在符合查询条件的数据行,则返回无匹配项的扫描结果。29.同一类型的有序表使用相同的迭代器来进行扫描。对以lsm-tree为存储架构的数据库,memtable是一种类型的有序表,l0层的sstable是一种类型的有序表,l1层的sstable是一种类型的有序表,…,即,如果把内存算作一层的话,每一层的有序表是一个类型。30.在现有的实现方案中,如果本次查询操作还需要查找下一个有序表,则在对下一个有序表进行扫描前,先全部释放查找上一个有序表时使用的迭代器、缓存数据块等资源,然后重新生成用来查找下一个有序表的迭代器,由新的迭代器重复上述查找过程。这样的方案在各次扫描之间没有依赖关系,简单且易于实现。31.但是,有序表的特点是数据有序存储,在一些应用场景中,同一个查询中多次扫描针对的有序表经常是同一个类型,因而所使用的也是相同的迭代器;同时如果多次扫描的数据是有序的,那么前一次扫描的目标数据块常常就是下一次扫描的目标数据块,这样前一次扫描生成的缓存数据块在下一次扫描中很可能直接命中。比如,在嵌套连接(nestloopjoin)、二级索引回表、跨多个分区查询等查询中,常常会对同一个目标数据块连续进行多次扫描。以嵌套连接为例,嵌套连接用来发现两个表中关联的数据行,对于左表每一行数据,对右表进行一次扫描来找到关联的行,这样右表将被重复的扫描。在二级索引回表、跨分区查询中则是分别需要多次扫描被索引表、下一分区。这些应用场景中在每次扫描时都重新生成迭代器、重新生成缓冲数据块,并不是高效率的做法。32.因此,本说明书的实施例提出一种新的lsm-tree架构数据库有序表的查询方法,在对当前有序表进行扫描时,如果当前迭代器匹配于当前有序表的类型,可以用于对当前有序表的扫描,则保留当前迭代器;如果当前缓存数据块与本次扫描的目标数据块相同,则保留当前缓存数据块用于本次扫描,从而使得迭代器或缓存数据块能够在一定条件下复用于多次扫描,而不必为每次扫描生成迭代器和缓存数据块,利用有序表查询操作的特点提高了扫描的速度,改善了lsm-tree架构数据库的读取性能。33.本说明书的实施例可以运行在任何具有计算和存储能力的设备上,如手机、平板电脑、pc(personalcomputer,个人电脑)、笔记本、服务器等设备;还可以由运行在两个或两个以上设备的逻辑节点来实现本说明书实施例中的各项功能。34.本说明书的实施例中,对lsm-tree架构数据库有序表的查询包括根据查询条件依次扫描一张到多张有序表。对有序表的查询基于查询条件来进行,查询条件可以是各种能够对有序表数据行进行筛选的条件表达式,本说明书的实施例不做限定。例如,可以是数据行中某个字段的值在某个设定范围内、最后更改时间晚于某个特定时间点的数据行等等。扫描的目的是将有序表中符合查询条件的数据提取出来、或者确认有序表中不存在符合查询条件的数据35.对lsm-tree架构数据库有序表的查询中,对某一张有序表的扫描流程如图1所示。36.步骤110,将该某一种有序表作为当前有序表。37.把即将进行扫描的有序表作为当前有序表。当前有序表是本次扫描的目标对象。38.步骤120,在当前迭代器匹配于当前有序表的类型时,保留当前迭代器;否则获取与当前有序表匹配的迭代器作为当前迭代器。39.如前所述,对有序表的查询包括一次到多次逐次进行的扫描,每次扫描都由迭代器负责执行。同一种类型的有序表使用相同的迭代器。40.在开始本次扫描时,当前迭代器即是上一次扫描时使用的迭代器。对初次扫描来说不存在当前迭代器,此时可以参照现有的实现,生成与当前有序表类型匹配的迭代器来执行本次扫描,不再赘述。对非初次扫描的情形,如果当前迭代器匹配于当前有序表的类型,则当前迭代器能够用于本次扫描,无需重新构建新的迭代器,保留当前迭代器来执行本次扫描。如果当前迭代器与当前有序表的类型不匹配,则获取与当前有序表匹配的迭代器,并将其作为当前迭代器。41.获取与当前有序表匹配的迭代器的方式可以根据实际应用场景的具体实现来确定,不做限定。在一个例子中,如果当前迭代器与当前有序表的类型不匹配,则释放当前迭代器,并生成匹配于当前有序表类型的新迭代器。42.在另一个例子中,可以由使用过的迭代器构建迭代器池,在当前迭代器与当前有序表的类型不匹配时,将当前迭代器返回至迭代器池中,再从迭代器池中申请与当前有序表类型匹配的迭代器,如果申请成功,则将申请到的迭代器作为新的当前迭代器;否则生成与当前有序表类型匹配的迭代器并将其作为新的当前迭代器。这样,曾经使用过的迭代器会不断放入迭代器池中,供后续通过申请即可使用,而无需重新生成,提高了更换迭代器的速度。43.步骤130,由当前迭代器确定本次扫描的目标数据块。44.在得到本次扫描要使用的当前迭代器后,由当前迭代器根据查询范围确定本次扫描的目标数据块。查询范围及目标数据块的确定与实际应用场景中有序表中数据行的存储方式、查询操作的具体实现等因素相关,可以参照现有的方式,不再赘述。45.步骤140,当本次扫描的目标数据块与当前缓存数据块是同一个数据块时,保留当前缓存数据块;否则读取本次扫描的目标数据块在缓存中生成当前缓存数据块。46.在目标数据块中查找与符合查询条件的数据行时,将目标数据块的内容读取到缓存中能够加快查找的速度。在当前迭代器确定目标数据块后,当前缓存数据块是对上一次扫描的目标数据块的缓存。当前迭代器比对当前缓存数据块(即上一次扫描的目标数据块)与本次扫描的目标数据块是否是同一个数据块,如果是,则当前缓存数据块可以直接用来进行本次扫描,予以保留;如果不是同一个数据块,则可以释放当前缓存数据块,从有序表中读取本次扫描的目标数据块,在缓存中生成新的当前缓存数据块。47.对一些数据库产品,有序表以宏块和微块的组织形式来存储数据。对这些数据库产品,扫描时读入缓存的数据块是微块,换言之,目标数据块是目标微块,目标微块所属的宏块是目标宏块。由于需要利用宏块的一些信息来定位到属于该宏块的微块,迭代器采用一个数据结构来保存要读取的微块所属宏块的信息,本说明书实施例中将这一数据结构称之为当前宏块。48.当前迭代器在确定本次扫描的目标宏块和其内部目标微块后,当前宏块中存放的是上一次扫描的目标宏块的信息,当前缓存数据块是对上一次扫描的目标微块的缓存。当前迭代器比对本次扫描的目标微块与上一次扫描的目标微块是否是同一个微块,如果是同一个微块则保留当前缓存数据块。如果不是同一个微块,当前迭代器比对本次扫描的目标微块与上一次扫描的目标微块是否属于同一个宏块,如果属于同一个宏块,则直接采用当前宏块来定位本次扫描的目标微块,读取本次扫描的目标微块并在缓存中生成新的当前缓存数据块;如果不属于同一个宏块,则将当前宏块更新为本次扫描的目标宏块的信息,再采用更新后的当前宏块来定位本次扫描的目标微块,读取本次扫描的目标微块并在缓存中生成新的当前缓存数据块。49.步骤150,由当前迭代器根据查询条件扫描当前缓存数据块。50.当前迭代器采用查询条件来扫描当前缓存数据块。如果当前缓存数据块中存在符合查询条件的一个到多个数据行,则按照这些数据行生成扫描结果并返回;如果当前缓存数据块中不存在符合查询条件的数据行,则返回未找到匹配项的扫描结果。51.在一些实施方式中,在当前迭代器内,可以采用解码器来对缓存数据块中的数据行进行解码,并查找符合查询条件的数据行。在解码器进行解码和查找前,通过对解码器进行初始化,按照本次扫描的目标数据块来构建解码器的内部状态,使得解码器能够正确解读缓存数据块。52.在这些实施方式中,当本次扫描的目标数据块与上一次扫描的目标数据块是同一个数据块时,解码器的内部状态已经可以用于解码本次扫描的目标数据块,初始化没有必要,可以由解码器直接根据查询条件对当前缓存数据块进行解码和扫描。当本次扫描的目标数据块与上一次扫描的目标数据块不是同一个数据块时,需要重建解码器的内部状态,则根据本次扫描的目标数据块初始化解码器,由完成初始化后的解码器对当前缓存数据块进行解码和扫描。53.需要说明的是,在采用迭代器池的实现方式中,如果当前迭代器不匹配于当前有序表的类型、并且迭代器池中不存在与当前有序表类型匹配的迭代器,则需要生成与当前有序表类型匹配的迭代器作为当前迭代器。由于新生成的当前迭代器肯定不会与上一次扫描有相同的目标数据块,则可以直接读取本次扫描的目标数据块在缓存中生成当前缓存数据块,再由当前迭代器采用查询条件扫描当前缓存数据块。既不需要考虑能否复用当前缓存数据块,也不需要考虑能否复用解码器的内部状态。54.可见,本说明书的实施例中,在迭代器、缓存数据块、目标宏块、解码器内部状态等各级资源中的一级到多级实现了多次扫描时对资源的复用,使得在对有序表进行嵌套连接、二级索引回表、或跨分区查询等查询操作时,能够避免对上述资源无效的重复加载或初始化过程,提高了查询效率,令lsm-tree架构数据库的读性能更为优越。55.上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。56.在本说明书的一个应用示例中,对采用lsm-tree架构的oceanbase数据库的查询操作包括嵌套连接、二级索引回表、和跨分区查询。在这些查询操作中,将逐层依次扫描各个memtable、l0层sstable、l1层sstable等等,直到找到符合查询条件的所有数据行、或确认不存在符合查询条件的数据行后结束。57.在上述三种查询操作中,对一张有序表的扫描流程如图2所示。58.步骤205,扫描开始,将待扫描的有序表作为当前有序表。59.步骤210,判断当前迭代器是否匹配于当前有序表的类型,如果是,保留当前迭代器,转步骤225;如果否,执行步骤215。60.步骤215,判断迭代器池中是否存在匹配于当前有序表类型的迭代器,如果是,执行步骤220,如果否,转步骤260。61.步骤220,释放当前迭代器并将其返回至迭代器池中,从迭代器池中申请匹配于当前有序表类型的迭代器,将申请到的迭代器其作为新的当前迭代器。62.步骤225,由当前迭代器确定本次扫描的目标宏块和目标微块。63.步骤230,判断本次扫描的目标微块是否与上一次扫描的目标微块是同一个微块,如果是,保留当前缓冲数据块和解码器的内部状态,转步骤255;如果否,执行步骤235。64.步骤235,判断本次扫描的目标宏块是否与上一次扫描的目标宏块是同一个宏块,如果是,保留当前宏块,转步骤245;如果否,执行步骤240。65.步骤240,按照本次扫描的目标宏块更新当前宏块,将当前宏块中存储的信息更新为本次扫描的目标宏块的信息。66.步骤245,按照当前宏块定位本次扫描的目标微块,读取目标微块中的数据行,在缓存中生成新的当前缓存数据块。67.步骤250,根据本次扫描的目标微块初始化解码器。68.步骤255,由解码器根据查询条件扫描当前缓存数据块,本次扫描结束。69.步骤260,生成与当前有序表类型匹配的迭代器作为当前迭代器,基于本次扫描的目标微块在缓存中生成当前缓存数据块,由当前迭代器采用查询条件扫描当前缓存数据块,本次扫描结束。70.与上述流程实现对应,本说明书的实施例还提供了一种lsm-tree架构数据库有序表的查询装置。该装置可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为逻辑意义上的装置,是通过所在设备的cpu(centralprocessunit,中央处理器)将对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,除了图3所示的cpu、内存以及存储器之外,lsm-tree架构数据库有序表的查询装置所在的设备通常还包括用于进行无线信号收发的芯片等其他硬件,和/或用于实现网络通信功能的板卡等其他硬件。71.图4所示为本说明书实施例提供的一种lsm-tree架构数据库有序表的查询装置,所述查询包括根据查询条件依次扫描一张到多张有序表,所述装置中用于对某一张有序表进行扫描的部分包括当前有序表单元、当前迭代器单元、目标数据块单元、和扫描执行单元,其中:当前有序表单元用于将所述某一张有序表作为当前有序表;当前迭代器单元用于在当前迭代器匹配于当前有序表的类型时,保留当前迭代器;否则获取与当前有序表匹配类型的迭代器作为当前迭代器;目标数据块单元用于由当前迭代器确定本次扫描的目标数据块;当前缓存数据块单元用于当本次扫描的目标数据块与当前缓存数据块是同一个数据块时,保留当前缓存数据块;否则读取本次扫描的目标数据块到缓存中生成新的当前缓存数据块;扫描执行单元用于由当前迭代器根据查询条件扫描当前缓存数据块。72.一个例子中,所述当前迭代器单元获取与当前有序表类型匹配的迭代器作为当前迭代器,包括:将当前迭代器返回至迭代器池中,从迭代器池中申请与当前有序表类型匹配的迭代器作为新的当前迭代器。73.上述例子中,所述装置还可以包括迭代器新增单元,用于在当前迭代器不匹配于当前有序表的类型、并且迭代器池中不存在与当前有序表类型匹配的迭代器时,生成与当前有序表类型匹配的迭代器作为当前迭代器,读取本次扫描的目标数据块到缓存中生成当前缓存数据块,由当前迭代器采用查询条件扫描当前缓存数据块。74.可选的,所述目标数据块为微块,属于某一个宏块;所述目标数据块单元具体用于:由当前迭代器确定本次扫描的目标宏块及其内部的目标微块;所述当前缓存数据块单元具体用于:当本次扫描的目标微块与上一次扫描的目标微块是同一个微块时,保留当前缓存数据块;当本次扫描的目标微块与上一次扫描的目标微块不是同一个微块并且均属于同一个宏块时,基于当前宏块定位本次扫描的目标微块,读取本次扫描的目标微块到缓存中生成新的当前缓存数据块;当本次扫描的目标微块与上一次扫描的目标微块不是同一个微块并且不属于同一个宏块时,按照本次扫描的目标微块所属的宏块更新当前宏块,基于更新后的当前宏块定位本次扫描的目标微块,读取目标微块到缓存中生成新的当前缓存数据块。75.可选的,所述当前迭代器包括解码器;所述扫描执行单元具体用于:当本次扫描的目标数据块与上一次扫描的目标数据块是同一个数据块时,由解码器根据查询条件对当前缓存数据块进行解码和扫描;当本次扫描的目标数据块与上一次扫描的目标数据块不是同一个数据块时,根据本次扫描的目标数据块初始化解码器,由完成初始化后的解码器对当前缓存数据块进行解码和扫描。76.可选的,所述查询包括:嵌套连接nestloopjoin、二级索引回表、或跨分区查询。77.本说明书的实施例提供了一种计算机设备,该计算机设备包括存储器和处理器。其中,存储器上存储有能够由处理器运行的计算机程序;处理器在运行存储的计算机程序时,执行本说明书实施例中lsm-tree架构数据库有序表的查询方法的各个步骤。对lsm-tree架构数据库有序表的查询方法的各个步骤的详细描述请参见之前的内容,不再重复。78.本说明书的实施例提供了一种计算机可读存储介质,该存储介质上存储有计算机程序,这些计算机程序在被处理器运行时,执行本说明书实施例中lsm-tree架构数据库有序表的查询方法的各个步骤。对lsm-tree架构数据库有序表的查询方法的各个步骤的详细描述请参见之前的内容,不再重复。79.以上所述仅为本说明书的较佳实施例而已,并不用以限制请求保护的其他实施例,凡在本说明书的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在请求保护的范围之内。80.在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。81.内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。82.计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。83.还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。84.本领域技术人员应明白,本说明书的实施例可提供为方法、系统或计算机程序产品。因此,本说明书的实施例可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书的实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。当前第1页12当前第1页12
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献