Page 258 - 《软件学报》2021年第11期
P. 258

3584                                Journal of Software  软件学报 Vol.32, No.11, November 2021

                 条记录,并更新到上层索引中,从而完成 W i 窗口的索引构建.B+树是平衡树,更新过程会动态调整节点以保持平
                 衡性.上层索引中,其 key 值是窗口时间,具有线性递增的特点.若采用传统的更新方法,更新过程会导致大量的节
                 点分裂,且分裂后的节点由于 key 值递增的特点,后续不会再有数据写入.本文结合当前场景,针对传统更新方法
                 存在的存储资源浪费、性能不稳定等问题,提出一种避免节点分裂的更新方法,在保持 B+树相对平衡的前提下,
                 提高更新性能.
                    上层索引更新过程中,在 B+树中维护全局插入点,如图 7 所示.每次更新只需将新数据顺序的写入叶节点,
                 且更新过程不触发节点分裂,每个节点空间都能被完全利用.若全局插入点对应的叶节点空间饱和,则向上递归
                 查找未满父节点,再在父节点下递归创建子节点用于后续的数据写入.若所有父节点已满,则需要增加树高,创
                 建新的根节点作为父节点.上层索引每隔一个时间窗口更新一次,当叶节点空间饱和后,可预先创建叶节点,用
                 于后续更新写入.
                                                              根节点





                                           非叶节点                                非叶节点
                                         Key  ...  Key          ...          Key  ...




                                  叶节点                 叶节点           叶节点        P:全局插入节点
                                Key  ...  Key  ...  Key  ...  Key  Key  ...


                                                                     P inner:节点内部插入点
                                                 Fig.7    Upper B+ tree updates
                                                    图 7   上层 B+树更新

                    上层索引详细更新过程如算法 1 所述.
                    算法 1.  上层索引更新.
                    输入:key:待更新窗口起始时间;value:待更新窗口对应的下层索引引用.
                    输出:root:B+树根节点.
                    符号说明:B 表示 B+树阶数;P 表示上层索引插入节点;P index 表示节点内部插入偏移值;n height 表示上层 B+
                 树树高.
                    1.   若上层索引为空,则初始化索引:
                         1.1.  申请并初始化空间为 B 的节点 N init .并将其作为根节点:root←N init .
                         1.2.  初始化全局插入点和节点内部插入偏移值:P←node,P index ←0.
                         1.3.  更新树高:n height ←1;
                    2.   若上层索引不为空,则更新上层索引:
                         2.1.  根据全局插入点 P,直接插入到相应叶节点,更新叶节点对应的 P index ;
                         2.2.  若更新后 P index =1,表示对应的叶子节点是新节点,则需递归的对其父节点赋键值,过程如下:
                             assignKey(key,curNode){
                               若当前节点 curNode 为根节点 Root 或 curNode 已满则返回;
                               否则
                                将键值 key 添加到 curNode;
   253   254   255   256   257   258   259   260   261   262   263