一种ROWID对应关系数据的压缩和解压方法

一种ROWID对应关系数据的压缩和解压方法


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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信