一种基于Undo表空间解决PostgreSQL数据库表膨胀方法及系统技术方案

技术编号:35302639 阅读:17 留言:0更新日期:2022-10-22 12:51
本发明专利技术实施例公开了一种基于Undo表空间解决PostgreSQL数据库表膨胀方法及系统,其中方法包括:监测到PostgreSQL数据库发生数据更新,将所述原始数据行拷贝到Undo表空间,数据更新产生新版本数据行,于所述新版本数据行的行头存储Undo指针;响应于所述PostgreSQL数据库发生事务回滚,将所述原始数据行从所述Undo表空间拷贝回原地;响应于所有会话不再需要访问所述Undo表空间的所述原始数据行,清理所述原始数据行,释放所述Undo表空间;本发明专利技术公开的一个方面可以解决PostgreSQL索引膨胀和表膨胀问题。膨胀问题。

【技术实现步骤摘要】
一种基于Undo表空间解决PostgreSQL数据库表膨胀方法及系统


[0001]本专利技术涉及互联网
,特别是涉及一种基于Undo表空间解决PostgreSQL数据库表膨胀的方法及系统。

技术介绍

[0002]随着信息化在社会生活中逐渐占据主角,由IT时代进入到DT时代,数据的爆炸式增长,数据成几何增持,增加了企业的数据存储成本,为避免数据存储成本过高,通常采用多版本并发控制的方式进行数据管理。
[0003]PostgreSQL(PG)实现多版本并发控制是基于APPEND的方式实现,即新旧版本的数据行都存储在数据块中,当执行更新操作时等价于在PG中删除该行的旧版本(逻辑删除,只是添加删除标识),然后在数据库中插入该行的新版本数据;旧版本的数据行并不会及时的从数据块清理掉。直到VACUUM(PostgreSQL内置的垃圾回收清理工具)进程的运行,将DEAD TUPLE(死亡数据)占用的空间标记为可用,才会在下次数据写入时,尽可能的利用该部分空间。
[0004]因此当数据表经过大量的更新和删除操作时,会遗留下大量的DEAD TUPLES,这些空间不会返还给操作系统。新插入的数据行不能有效利用这些空间,只能扩展新的数据块,随着时间推移导致表越来越大,即表膨胀。尤其随着业务系统的运行,对于DML操作(以插入、更新与删除操作为核心)更为频繁,表的膨胀会越来越大,进行影响SQL语句的执行效率,降低客户的体验感知度。PG基于该问题提出HOT的优化方法,但该方法有以下两点限制:(1)当前的数据块必须有足够的空闲空间容纳新的数据行;(2)涉及更新的行的列上不能创建索引。
[0005]并且,PG当前的方案,限制较多,当更新的列上具有索引时,只能将新版本的数据插入新数据块中,且索引项中也会出现分裂,导致索引膨胀。因此,为了更好减轻企业硬件存储成本,亟需解决PostgreSQL表膨胀问题。

技术实现思路

[0006]为克服上述现有技术存在的不足,本专利技术之目的在于提供一种基于Undo表空间解决PostgreSQL数据库表膨胀方法及系统,基于UNDO存储引擎的方式来实现就地更新,即使更新列上有索引,也无需触发该索引的更新操作,从而避免数据表的膨胀。
[0007]为达上述目的,本专利技术提出一种基于Undo表空间解决PostgreSQL数据库表膨胀方法,包括如下步骤:监测到PostgreSQL数据库发生数据更新,将所述原始数据行拷贝到Undo表空间,数据更新产生新版本数据行,于所述新版本数据行的行头存储Undo指针;响应于所述PostgreSQL数据库发生事务回滚,将所述原始数据行从所述Undo表空间拷贝回原地;
响应于所有会话不再需要访问所述Undo表空间的所述原始数据行,清理所述原始数据行,释放所述Undo表空间。
[0008]进一步地,所述方法还包括如下步骤:响应于所述PostgreSQL数据库发生事务提交,将所述Undo表空间存储的所述原始数据行根据多版本并发控制用于其他数据库会话。
[0009]进一步地,所述监测到PostgreSQL数据库发生数据更新,将所述原始数据行拷贝到Undo表空间,数据更新产生新版本数据行,于所述新版本数据行的行头存储Undo指针,包括如下步骤:所述PostgreSQL数据库运行Undo Launcher进程监测正在运行的操作是否为写操作;响应于所述Undo Launcher进程监测到正在运行写操作,所述Undo Launcher进程向Undo Worker进程发送写操作通知;所述Undo Worker进程接收到写操作通知,将所述原始数据行拷贝至Undo表空间;所述PostgreSQL数据库中的写操作原地执行,得到新版本数据行;于所述新版本数据行的行头存储Undo指针,所述Undo指针指向Undo表空间中所述原始数据行。
[0010]进一步地,所述方法还包括如下步骤:通过Undo Launcher进程监测到所述PostgreSQL数据库发生事务回滚或事务提交操作,向Undo Worker进程发送事务回滚通知或事务提交通知;响应于所述Undo Worker进程接收到事务回滚通知,将所述原始数据行从所述Undo表空间拷贝回原地;响应于所述Undo Worker进程接收到事务提交通知,将所述Undo表空间存储的所述原始数据行根据多版本并发控制用于其他数据库会话。
[0011]进一步地,所述响应于所有会话不再需要访问所述Undo表空间的所述原始数据行,清理所述原始数据行,释放所述Undo表空间,包括如下步骤:通过Undo Launcher进程监控到所有会话不再需要访问所述原始数据行,通知Undo Clean Worker进程进行数据清理;所述Undo Clean Worker进程接收到数据清理通知,对所述原始数据行进行清理,释放所述Undo表空间。
[0012]进一步地,所述方法还包括如下步骤:响应于其他数据库访问所述PostgreSQL数据库内的数据,其他数据库会话读取PostgreSQL数据库内不同版本的数据;若所述其他数据库会话需要读取旧版本数据,所述其他数据库会话根据Undo指针从所述Undo表空间获取原始数据行。
[0013]进一步地,所述方法还包括如下步骤:响应于更新所述原始数据行中存在索引的列,将所述列的旧值对应的索引条目标设为删除标记,并将所述列更新后的新值按照顺序在索引树中插入新的索引条目。
[0014]进一步地,所述方法还包括如下步骤:将所述PostgreSQL数据库发生的所有数据变更操作写入WAL日志,并同步到磁盘
上;所述数据变更操作包括但不限于创建对象、修改对象、删除对象、UPDATE操作、DELETE操作、INSERT操作、索引变更操作、事务回滚操作和事务提交操作。
[0015]为达上述目的,本专利技术还提出一种基于Undo表空间解决PostgreSQL数据库表膨胀的系统,包括:数据更新模块,用以监测到PostgreSQL数据库发生数据更新,将所述原始数据行拷贝到Undo表空间,数据更新产生新版本数据行,于所述新版本数据行的行头存储Undo指针;事务回滚模块,用以响应于所述PostgreSQL数据库发生事务回滚,将所述原始数据行从所述Undo表空间拷贝回原地;数据清理模块,响应于所有会话不再需要访问所述Undo表空间的所述原始数据行,清理所述原始数据行,释放所述Undo表空间。
[0016]进一步地,所述系统还包括:事务提交模块,用以响应于所述PostgreSQL数据库发生事务提交,将所述Undo表空间存储的所述原始数据行根据多版本并发控制用于其他数据库会话。
[0017]进一步地,所述系统还包括:索引列更新模块,用以响应于更新所述原始数据行中存在索引的列,将所述列的旧值对应的索引条目标设为删除标记,并将所述列更新后的新值按照顺序在索引树中插入新的索引条目。
[0018]与现有技术相比,本专利技术公开的一个方面带来的有益效果为:(1)本专利技术基于Undo存储引擎,当数据行变更,将该行本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于Undo表空间解决PostgreSQL数据库表膨胀方法,包括如下步骤:监测到PostgreSQL数据库发生数据更新,将所述原始数据行拷贝到Undo表空间,数据更新产生新版本数据行,于所述新版本数据行的行头存储Undo指针;响应于所述PostgreSQL数据库发生事务回滚,将所述原始数据行从所述Undo表空间拷贝回原地;响应于所有会话不再需要访问所述Undo表空间的所述原始数据行,清理所述原始数据行,释放所述Undo表空间。2.如权利要求1所述的一种基于Undo表空间解决PostgreSQL数据库表膨胀方法,其特征在于,所述方法还包括如下步骤:响应于所述PostgreSQL数据库发生事务提交,将所述Undo表空间存储的所述原始数据行根据多版本并发控制用于其他数据库会话。3.如权利要求1所述的一种基于Undo表空间解决PostgreSQL数据库表膨胀方法,其特征在于,所述监测到PostgreSQL数据库发生数据更新,将所述原始数据行拷贝到Undo表空间,数据更新产生新版本数据行,于所述新版本数据行的行头存储Undo指针,包括如下步骤:所述PostgreSQL数据库运行Undo Launcher进程监测正在运行的操作是否为写操作;响应于所述Undo Launcher进程监测到正在运行写操作,所述Undo Launcher进程向Undo Worker进程发送写操作通知;所述Undo Worker进程接收到写操作通知,将所述原始数据行拷贝至Undo表空间;所述PostgreSQL数据库中的写操作原地执行,得到新版本数据行;于所述新版本数据行的行头存储Undo指针,所述Undo指针指向Undo表空间中所述原始数据行。4.如权利要求2所述的一种基于Undo表空间解决PostgreSQL数据库表膨胀方法,其特征在于,所述方法还包括如下步骤:通过Undo Launcher进程监测到所述PostgreSQL数据库发生事务回滚或事务提交操作,向Undo Worker进程发送事务回滚通知或事务提交通知;响应于所述Undo Worker进程接收到事务回滚通知,将所述原始数据行从所述Undo表空间拷贝回原地;响应于所述Undo Worker进程接收到事务提交通知,将所述Undo表空间存储的所述原始数据行根据多版本并发控制用于其他数据库会话。5.如权利要求1所述的一种基于Undo表空间解决PostgreSQL数据库表膨胀方法,其特征在于,所述响应于所有会话不再需要访问所述Undo表空间的所述原始数据行,清理所述原始数据行,释放所述Undo表空间,包括...

【专利技术属性】
技术研发人员:马晓周正凯徐丽娟贾伟张亚萍郝菊芳
申请(专利权)人:中国烟草总公司职工进修学院
类型:发明
国别省市:

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

1