一种基于折半查找的时序数据库迭代器查询优化方法技术

技术编号:38104688 阅读:7 留言:0更新日期:2023-07-06 09:25
本发明专利技术提供一种基于折半查找的时序数据库迭代器查询优化方法,属于时序数据库领域,本发明专利技术基于数据特点,在使用迭代器进行查询时,放弃逐个判断block块是否满足条件,使用折半查找定位第一个满足查询条件的block及第一条满足查询条件的行,从而实现性能提升。从而实现性能提升。从而实现性能提升。

【技术实现步骤摘要】
一种基于折半查找的时序数据库迭代器查询优化方法


[0001]本专利技术涉及时序数据库领域,尤其涉及一种基于折半查找的时序数据库迭代器查询优化方法。

技术介绍

[0002]ZDP是一个集云(C)边(E)端(T)一体的时序数据库平台,数据通过终端的采集器收集后同步到边端,边端提供数据持久化能力,整体采用LSM架构,数据先写入内存,等内存数据达到阈值后进行Flush持久化。内存的数据以block为单位进行内存分配和回收,由WriteCache组件进行统一管理,每个block大小均相等,依次放在WriteCache维护的一个队列里,队列头的block数据最老,block按照时间戳依次排序,每个block内部数据也是基于时间错排序的。当上层caller需要读取内存的数据时,就需要生成一个迭代器,传入参数(min_ts,max_ts)就可以进行扫描读取。而当前默认实现是通过逐个遍历的方式来确定满足条件的block以及block中第一条满足条件的行,这成为生成迭代器性能瓶颈。

技术实现思路

[0003]为了解决以上技术问题,本专利技术提供了一种基于折半查找的时序数据库迭代器查询优化方法,较大的提升迭代器查询性能。
[0004]本专利技术的技术方案是:
[0005]一种基于折半查找的时序数据库迭代器查询优化方法,在迭代器初始化阶段,通过折半查找方法进行搜索满足条件的block集合左右边界,同时用折半查找定位第一条满足条件的行,代替了逐个遍历block来判断是否满足要求,提升数据库读性能。
[0006]迭代器本身维护了满足读条件的block集合,在初始化过程中,不再逐个遍历block判断是否满足条件,而是基于数据是有序的特征,通过折半查找的方式来实现block集合左右边界的确定,实现迭代器读性能提升。
[0007]进一步的,
[0008]实现包括内容如下:
[0009]1)迭代器的初始化,首先是确定满足条件的block集合和第一条满足条件的行位置row_cursor_,之后才可以正常使用迭代器。
[0010]2)当WriteCache的block为空、option.min_ts>last_block.max_ts、option.max_ts<first_block.min_ts三种情况时,直接返回,代表当前没有满足条件的数据。
[0011]3)若存在满足条件的数据,当option.max_ts>last_block.min_ts,则代表已经找到右边界,记has_found_right_boundary=true;当option.min_ts<first_block.max_ts,则代表已经找到左边界,记has_found_left_boundary=true。
[0012]4)若has_found_left_boundary=false,则代表还未确定左边界,需要使用折半查找来定位。首先初始化left=0,right=block_num

1,mid=(left+right)/2,通过不断比较option.min_ts与mid_block.max_ts大小,最终确定左边界;同理,来确定右边界。
[0013]再进一步的,当right>left+1条件不满足时,跳出循环。当mid_block.max_ts<option.min_ts时,代表数据在mid的右边,故设置left=mid,否则设置right=mid。跳出循环后,可以确定right

left=1,因为确定数据存在,故left_boundary=right,同理找出右边界。最终把左右边界内的block添加到迭代器维护的block列表中。
[0014]迭代器维护了一个block引用列表,当有迭代器在使用时,引用的底层block不会被删除,保证了读数据的一致性,不受数据库数据的写影响,提供了一个一致性视图。
[0015]再进一步的,在使用迭代器之前,同样需要确定第一行满足条件的下标row_cursor_,实现包括如下内容:
[0016]1)基于block内数据是有序的特征,当option.min_ts<=first_block.min_ts时,代表整个block数据均满足条件,故设置row_cursor_=0;当option.min_ts>first_block.max_ts时,代表整个block数据均不满足要求,返回错误。
[0017]2)当存在部分数据时,需要通过折半查找的方式找到第一行满足条件的数据。记left=0,right=committed_num

1,当right>left+1时,不断执行如下操作:mid=(left+right)/2,当option.min_ts<=first_block[mid].ts时,right=mid,否则left=mid,直至跳出循环。记row_cursor_=right。
[0018]再进一步的,迭代器初始化完成后,维护了满足条件的block集合和指向第一条数据的row_cursor_指针。迭代器在Next执行时,row_cursor_指针不断向前推进,指向下一条数据。
[0019]迭代器维护了一个一致性读视图,迭代器读不受数据库的写影响。
[0020]本专利技术的有益效果是
[0021]优化了时序数据库ZDP内存迭代器查询性能低问题,不再使用逐个遍历的方式来确定满足条件的block集合、第一个block内满足条件的第一行,而是基于时序数据是排序的特点,采用折半查找的方式。通过这种方式,在数据量较大的情况下,可以快速的定位满足条件的block块集合的左右边界,减少迭代器初始化的时间,从而提升数据库查询的性能。
附图说明
[0022]图1是优化前迭代器遍历定位block示意图;
[0023]图2是优化后迭代器折半定位block示意图。
具体实施方式
[0024]为使本专利技术实施例的目的、技术方案和优点更加清楚,下面将结合本专利技术实施例中的附图,对本专利技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本专利技术一部分实施例,而不是全部的实施例,基于本专利技术中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本专利技术保护的范围。
[0025]在数据有序的场景下,确定目标数据范围常采用折半查找的方式,通过该方式可以高效的找出目标数据的左边界和右边界,之后迭代器就可以以左边界为基础进行迭代搜寻了,迭代器每次Next后,只需要判断当前数据的时间戳cur_ts与max_ts的大小来判断是否越界。通过理论分析,优化前通过逐个遍历的复杂度为O(n),优化后效率为O(lg2 N),可
以较大的提升性能。在优化实现时,针对确定边界block和第一条行做了特殊优化,在保本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于折半查找的时序数据库迭代器查询优化方法,其特征在于,通过折半查找定位目标数据的左右边界及第一个block中满足条件的首行,迭代器通过Next来获取下一条数据。2.根据权利要求1所述的方法,其特征在于,步骤如下:1)迭代器的初始化,首先是确定满足条件的block集合和第一条满足条件的行位置row_cursor_,之后才可以正常使用迭代器;2)当WriteCache的block为空、option.min_ts>last_block.max_ts、option.max_ts<first_block.min_ts三种情况时,直接返回,代表当前没有满足条件的数据;3)若存在满足条件的数据,当option.max_ts>last_block.min_ts,则代表已经找到右边界,记has_found_right_boundary=true;当option.min_ts<first_block.max_ts,则代表已经找到左边界,记has_found_left_boundary=true;4)若has_found_left_boundary=false,则代表还未确定左边界,需要使用折半查找来定位。3.根据权利要求2所述的方法,其特征在于,步骤4)中,首先初始化left=0,right=block_num

1,mid=(left+right)/2,通过不断比较option.min_ts与mid_block.max_ts大小,最终确定左边界;同理,来确定右边界。4.根据权利要求3所述的方法,其特征在于,当right>left+1条件不满足时,跳出循环;当mid_block.max_ts<option.min_ts时,代表数据在mid的右边,故设置left=mid,...

【专利技术属性】
技术研发人员:王云龙于暄
申请(专利权)人:上海沄熹科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1