2024年6月15日发(作者:)
(19)中华人民共和国国家知识产权局
(12)发明专利说明书
(21)申请号 CN2.7
(22)申请日 2019.06.05
(71)申请人 上海英方软件股份有限公司
地址 201114 上海市闵行区浦锦路2049弄万科VMO花园广场15幢
(72)发明人 高志会 李天伟 林广生
(74)专利代理机构 北京君尚知识产权代理有限公司
代理人 邱晓锋
(51)
(10)申请公布号 CN 110399372 A
(43)申请公布日 2019.11.01
权利要求说明书 说明书 幅图
(54)发明名称
一种ROWID对应关系数据的压缩
和解压方法
(57)摘要
本发明提出一种ROWID对应关系
数据的压缩和解压方法,属于计算机
ORACLE数据库同步领域,充分利用映射
块内数据的特点,设置标记字节FLG,逐
个判断SLOT是否记录、DBA是否重复、
OBJD是否重复、ROWID是否连续,实现
压缩,通过判断FLG的比特是否置位,来
实现解压;算法简单,执行速度快,对于
连续性高的ROWID映射数据有很高的压
缩率。
法律状态
法律状态公告日
法律状态信息
法律状态
权 利 要 求 说 明 书
1.一种ROWID对应关系数据的压缩方法,包括以下步骤:
对于ROWID对应关系数据,从源SLOT0开始,判断当前源SLOT有没有记录,
如果没有,则统计后面连续没有记录的SLOT的个数,输出标记字节FLG;如果
有,则生成新的标记字节FLG,输出目标SLOT,并根据SLOT是否小于256更新
FLG;
判断当前目标DBA是否与前面的DBA有重复,如果没有,则输出新的DBA并记
录;如果有,则输出DBA的索引,并根据DBA的索引号是否小于256更新FLG;
判断当前目标OBJD是否与前面的OBJD有重复,如果没有,则输出新的OBJD并
记录;如果有,则输出OBJD的索引,并根据OBJD的索引号是否小于256更新
FLG;
判断后续是否有目标ROWID和当前连续,如果有,则输出连续个数,并根据连续
个数是否小于256更新FLG;
执行上述步骤直到没有ROWID记录时,完成压缩。
2.如权利要求1所述的压缩方法,其特征在于,统计后面连续没有记录的SLOT的
个数不超过127个。
3.如权利要求1所述的压缩方法,其特征在于,判断后续是否有目标ROWID和当
前连续的标准是OBJD和DBA是否与当前目标ROWID相同,且目标SLOT连续
递增。
4.如权利要求1所述的压缩方法,其特征在于,如果还有ROWID记录,则进一步
判断当前源SLOT有没有记录,并执行后续操作。
5.如权利要求1所述的压缩方法,其特征在于,每一段压缩数据均以一个FLG开
始,该FLG含有如下8个比特位:
比特7:源SLOT无记录标记位,置此位,则另外7位代表连续多少个SLOT没有
记录;
比特6:目标SLOT占1字节还是2字节;
比特5:新目标DBA标记,置此位,代表着遇到了新DBA,压缩数据包含4字节
的DBA;反之,代表遇到了使用过的DBA,压缩数据包含DBA的索引;
比特4:DBA索引占1字节还是2字节;
比特3:新目标OBJD标记,置此位,代表着遇到了新OBJD,压缩数据包含4字
节的OBJD;反之,代表遇到了使用过的OBJD,压缩数据包含OBJD的索引;
比特2:OBJD索引占1字节还是2字节;
比特1:表示目标ROWID是连续的,压缩数据包含连续ROWID的个数;
比特0:连续的ROWID个数占1字节还是2字节。
6.如权利要求5所述的压缩方法,其特征在于,所述根据SLOT是否小于256更新
FLG,是指如果SLOT小于256,输出1字节,否则输出2字节,更新FLG比特6。
7.如权利要求5所述的压缩方法,其特征在于,所述根据DBA的索引号是否小于
256更新FLG,是指如果DBA的索引号小于256,输出1字节,否则输出2字节,
更新FLG比特5和4。
8.如权利要求5所述的压缩方法,其特征在于,所述根据OBJD的索引号是否小于
256更新FLG,是指如果OBJD的索引号小于256,则输出1字节,否则输出2字
节,更新FLG比特3和2。
9.如权利要求5所述的压缩方法,其特征在于,所述根据连续个数是否小于256更
新FLG,是指如果连续个数小于256,则输出1字节,否则输出2字节,更新FLG
比特1和0。
10.一种ROWID对应关系数据的解压方法,包括以下步骤:
对于ROWID对应关系数据的数据包,取当前标记字节FLG,如果比特7置位,则
取出其另7个比特的数值N,并将连续N个源SLOT标记为无记录,然后重复该
步骤;
如果比特7未置位,则按比特6的指示取出1或2字节的目标SLOT;
如果FLG的比特5置位,则取出4字节的目标DBA并记录,否则按照比特4的指
示取出1或2字节的DBA索引号,然后用该索引在DBA记录中取出目标DBA;
如果FLG的比特3置位,则取出4字节的目标OBJD并记录,否则按照比特4的
指示取出1或2字节的OBJD索引号,然后用该索引在OBJD记录中取出目标
OBJD;
如果FLG的比特1置位,则按照比特0指示取出1或2字节作为连续ROWID的数
量,并生成相应数量的连续ROWID;
执行上述步骤直到没有未解压数据,完成解压。
说 明 书
技术领域
本发明属于计算机ORACLE数据库同步领域,具体涉及一种ROWID对应关系数
据的压缩和解压方法。
背景技术
ORACLE数据库是一种使用非常广泛的数据库,ORACLE数据库中存储的每一行
记录都有一个唯一的标识叫做ROWID,用ROWID可以查询到这条记录。
ROWID分为三部分,OBJD、DBA和SLOT,共10个字节。OBJD占4字节,是
ORACLE数据库给每个表、表的分区或者子分区分配的唯一编号;DBA是数据块
的编号,占4字节,ORACLE将记录存储在不同的数据块上;一个数据块内可以
存储多条记录,同一数据块内的所有记录的ROWID,它们的OBJD和DBA是相
同的,记录在块内的编号称为SLOT,占2字节。
为方便描述,以下将源库和目标库的记录的ROWID分别称为源ROWID和目标
ROWID。
在做ORACLE数据库同步时,需要将源库的记录同目标库的记录一一对应起来,
才能将源库的记录变化正确地更新到目标库。其中的一种方式是采用ROWID映射,
即将源ROWID和目标ROWID的对应关系存储下来,在同步针对记录的更新和删
除动作时首先根据源记录的ROWID查询目标ROWID,从而对应到目标记录。
在存储ROWID对应关系时,通常是用源库的OBJD,DBA确定具体的存储块,然
后每个存储块内存储源SLOT和目标ROWID,每一条记录需要10+2共12个字节,
如果一个块内有1000条记录,数据量将达到12000字节。为描述方便,以下将每
个源库数据块的ROWID映射数据称为映射块。
映射块需要占用一定的空间,但它有大量相同或者相近的数据,目标SLOT很多时
候是连续的,目标OBJD通常是相同值,目标DBA也很容易重复,因此在存储上
有很大的压缩空间,鉴于它的查询会很频繁,压缩和解压的速度要快。现有的压缩
算法比如zip、minilzo,它们的速度不够,压缩的效果也不理想。
发明内容
本发明的目的在于提出一种ROWID对应关系数据的映射块的压缩和解压方法,能
够达到一定的压缩率,并且能快速地压缩解压。
为实现上述目的,本发明采用的技术方案如下:
一种ROWID对应关系数据的压缩方法,包括以下步骤:
对于ROWID对应关系数据,从源SLOT 0开始,判断当前源SLOT有没有记录,
如果没有,则统计后面连续没有记录的SLOT的个数,输出标记字节FLG;如果
有,则生成新的标记字节FLG,输出目标SLOT,并根据SLOT是否小于256更新
FLG;
判断当前目标DBA是否与前面的DBA有重复,如果没有,则输出新的DBA并记
录;如果有,则输出DBA的索引,并根据DBA的索引号是否小于256更新FLG;
判断当前目标OBJD是否与前面的OBJD有重复,如果没有,则输出新的OBJD并
记录;如果有,则输出OBJD的索引,并根据OBJD的索引号是否小于256更新
FLG;
判断后续是否有目标ROWID和当前连续,如果有,则输出连续个数,并根据连续
个数是否小于256更新FLG;
执行上述步骤直到没有ROWID记录时,完成压缩。
进一步地,每一段压缩数据均以一个FLG开始,该FLG含有如下8个比特位:
比特7:源SLOT无记录标记位,置此位,则另外7位代表连续多少个SLOT没有
记录;
比特6:目标SLOT占1字节还是2字节;
比特5:新目标DBA标记,置此位,代表着遇到了新DBA,压缩数据包含4字节
的DBA;反之,代表遇到了使用过的DBA,压缩数据包含DBA的索引;
比特4:DBA索引占1字节还是2字节;
比特3:新目标OBJD标记,置此位,代表着遇到了新OBJD,压缩数据包含4字
节的OBJD;反之,代表遇到了使用过的OBJD,压缩数据包含OBJD的索引;
比特2:OBJD索引占1字节还是2字节;
比特1:表示目标ROWID是连续的,压缩数据包含连续ROWID的个数;
比特0:连续的ROWID个数占1字节还是2字节。
进一步地,统计后面连续没有记录的SLOT的个数不超过127个。
进一步地,所述根据SLOT是否小于256更新FLG,是指如果SLOT小于256,输
出1字节,否则输出2字节,更新FLG比特6。
进一步地,所述根据DBA的索引号是否小于256更新FLG,是指如果DBA的索
引号小于256,输出1字节,否则输出2字节,更新FLG比特5和4。
进一步地,所述根据OBJD的索引号是否小于256更新FLG,是指如果OBJD的索
引号小于256,则输出1字节,否则输出2字节,更新FLG比特3和2。
进一步地,判断后续是否有目标ROWID和当前连续的标准是OBJD和DBA是否
与当前目标ROWID相同,且目标SLOT连续递增。
进一步地,所述根据连续个数是否小于256更新FLG,是指如果连续个数小于256,
则输出1字节,否则输出2字节,更新FLG比特1和0。
进一步地,如果还有ROWID记录,则进一步判断当前源SLOT有没有记录,并执
行后续操作。
一种ROWID对应关系数据的解压方法,包括以下步骤:
对于ROWID对应关系数据的数据包,取当前标记字节FLG,如果比特7置位,则
取出其另7个比特的数值N,并将连续N个源SLOT标记为无记录,然后重复该
步骤;
如果比特7未置位,则按比特6的指示取出1或2字节的目标SLOT;
如果FLG的比特5置位,则取出4字节的目标DBA并记录,否则按照比特4的指
示取出1或2字节的DBA索引号,然后用该索引在DBA记录中取出目标DBA;
如果FLG的比特3置位,则取出4字节的目标OBJD并记录,否则按照比特4的
指示取出1或2字节的OBJD索引号,然后用该索引在OBJD记录中取出目标
OBJD;
如果FLG的比特1置位,则按照比特0指示取出1或2字节作为连续ROWID的数
量,并生成相应数量的连续ROWID;
执行上述步骤直到没有未解压数据,完成解压。
本发明的压缩和解压方法充分利用了映射块内数据的特点,算法简单,执行速度快,
对于连续性高的ROWID映射数据有很高的压缩率。
附图说明
图1是ROWID的结构图。
图2是一个块内的ROWID示例。
图3是一种ROWID对应关系数据的压缩方法流程图。
图4是一种ROWID对应关系数据的解压方法流程图。
图5是映射块的数据示例。
图6是图5映射块的压缩结果。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面通过具体实施例和附
图,对本发明做进一步说明。
本实施例公开一种ROWID对应关系数据的压缩方法,如图3所示流程图,具体包
括以下步骤:
1)定义标记字节,以下简写为FLG,每一段压缩数据均以一个FLG开始,FLG的
8个比特位有不同的用途:
比特7:源SLOT无记录标记位,置此位,则另外7位代表连续多少个SLOT没有
记录。
比特6:目标SLOT占1字节还是2字节。
比特5:新目标DBA标记,置此位,代表着遇到了新DBA,压缩数据包含4字节
的DBA;反之,代表遇到了使用过的DBA,压缩数据包含DBA的索引。
比特4:DBA索引占1字节还是2字节。
比特3:新目标OBJD标记,置此位,代表着遇到了新OBJD,压缩数据包含4字
节的OBJD;反之,代表遇到了使用过的OBJD,压缩数据包含OBJD的索引。
比特2:OBJD索引占1字节还是2字节。
比特1:表示目标ROWID是连续的,压缩数据包含连续ROWID的个数。
比特0:连续的ROWID个数占1字节还是2字节。
2)从源SLOT 0开始处理。
3)如果当前源SLOT有记录,则进入下一步;否则查看后面有多少个连续的SLOT
没有记录,数量统计不超过127个,然后输出FLG,重入步骤3)。
4)生成新的FLG,并输出目标SLOT,如果SLOT小于256,输出1字节,否则输
出2字节;更新FLG比特6。
5)判断当前目标DBA是否与前面的DBA有重复,如果没有,输出新的DBA,并
记录;如果有,输出DBA的索引,索引号小于256时输出1字节,否则2字节;
更新FLG比特5和4。
6)判断当前目标OBJD是否与前面的OBJD有重复,如果没有,输出新的OBJD,
并记录;如果有,输出OBJD的索引,索引号小于256时输出1字节,否则2字节;
更新FLG比特3和2。
7)判断后续是否有目标ROWID和当前连续,标准是OBJD和DBA与当前目标
ROWID相同,且目标SLOT连续递增。如果有,则输出连续个数,连续个数小于
256输出1字节,大于等于256输出2字节,更新FLG比特1和0。如果没有,则
更新FLG比特1和0,并执行下一步骤
8)如果还有ROWID记录,重复第3步,否则压缩完成。
本实施例还公开一种ROWID对应关系数据的解压方法,其步骤包括:
1)采用上述压缩方法定义的压缩格式;
2)取当前FLG,如果比特7置位,则取出其另7个比特的数值N,并将连续N个
源SLOT标记为无记录,然后重复步骤2;如果比特7未置位,则按比特6的指示
取出1或2字节的目标SLOT;
3)如果FLG的比特5置位,则取出4字节的目标DBA,并记录,否则,按照比特
4的指示取出1或2字节的DBA索引号,然后用该索引在DBA记录中取出目标
DBA;
4)如果FLG的比特3置位,则取出4字节的目标OBJD,并记录,否则,按照比特
4的指示取出1或2字节的OBJD索引号,然后用该索引在OBJD记录中取出目标
OBJD;
5)如果FLG的比特1置位,则按照比特0指示取出1或2字节作为连续ROWID的
数量,并生成相应数量的连续ROWID;如果没有,则执行下一步骤
6)如果还有未解压数据,重复步骤2),否则解压完成。
下面以一具体压缩和解压实例为例来说明上述的压缩和解压方法,图3是本实例使
用的一个典型的映射块,具体说明如下。
该压缩方法的步骤如下:
S1:源SLOT 0有记录,目标SLOT为0,输出0,1字节,FLG值为00000000。
S2:目标DBA没有出现过,FLG更新为00100000,输出0x11BBC8B,4字节,
保存此DBA。
S3:目标OBJD没有出现过,FLG更新为00101000,输出26803,4字节,保存此
OBJD
S4:源SLOT 1有记录,但不与源SLOT 0连续,因此,源SLOT 0处理完毕。
S5:源SLOT 1的目标SLOT为500,输出500,2字节,FLG值为01000000。
S6:目标DBA出现过,输出索引号0,1字节,FLG值为01000000。
S7:目标OBJD出现过,输出索引号0,1字节,FLG值为01000000。
S8:源SLOT 1后续无连续ROWID,处理完毕。
S9:源SLOT 2和3无记录。两条无记录的SLOT输出FLG值10000010。
S10:源SLOT 4有记录,目标SLOT为7,输出7,1字节,FLG值为00000000。
S11:目标DBA未出现过,FLG更新为00100000,输出0x10825DB,4字节,保
存此DBA。
S12:目标OBJD出现过,输出索引号0,1字节,FLG值为00100000。
S13:后续2个目标ROWID连续,FLG值更新为00100010,输出2,1字节。
S14:压缩处理完毕,压缩结果见图4。
该解压方法的步骤如下:
S1:取第1个FLG,按标记位,取出1字节的目标SLOT(0),4字节的目标
DBA(0x11BBC8B)和4字节的目标OBJD(26803),并保存DBA和OBJD。
S2:取第2个FLG,按标记位,取出2字节的目标SLOT(500),目标DBA和
OBJD按索引取,结果同上条记录。
S3:取第3个FLG,比特7置位,其余7位值为2,代表两个无记录的源SLOT。
S4:取第4个FLG,按标记位,取出1字节目标SLOT(7),4字节的目标
DBA(0x10825DB),按索引方式取出目标OBJD(26803)。FLG比特1置位,代表着
有连续目标ROWID,取出1字节的连续ROWID数量(2),生成两个源SLOT的映
射数据,其目标SLOT分别为8和9。
S5:解压处理完毕。
以一组100行的ROWID映射数据为测试样本,样本内有6行ROWID映射不与其
它记录连续,模拟少量删除操作引起ROWID映射不连续的情况。下表为本发明方
法与ZIP在100万次压缩和解压测试后的数据对比。
表1本发明方法与ZIP实验数据
由上表可知,本发明的压缩和解压方法由于充分利用了映射块内数据的特点,算法
简单,使得执行速度快,对于连续性高的ROWID映射数据有很高的压缩率。
以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人
员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,
本发明的保护范围应以权利要求所述为准。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1718416979a2749524.html
评论列表(0条)