PG MVCC 与 Oracle MVCC实现机制的背后思想差异

本文探讨了PostgreSQL(PG)和Oracle的多版本并发控制(MVCC)机制的实现差异。PG通过在页头设置xmax字段标记元组为已删除,支持高并发和大型更新操作,但可能导致数据膨胀。Oracle则将死元组存放在独立的UNDO表空间,存在UNDO空间溢出的风险,限制并发能力。

PG MVCC 与 Oracle MVCC实现机制的背后思想差异

在PG中执行DELETE时, 行不会立即从数据文件中删除, 而是仅通过在页头中设置为xmax字段将其标记为已删除. 同样对于UPDATE, 它可能在PG中被视为DELETE + INSERT.
这就因为PG MVCC背后的基本思想之一, 因为它有如下好处:

  1. 允许更大并发
  2. 支持更大的UPDATE操作
  3. 在不同的进程之间最小的锁定

Oracle 也实现了MVCC, 不过Oracle中, 所谓的"死元组"不是存放的数据文件, 而是独立存放的"UNDO 回滚段表空间"中的, 相比PG, 存在如下缺点:

  1. 一个事务如果存在大量的更新操作, 可能会导致"UNDO表空间爆满", 而PG显然不存在这样的问题, 数据存储空间有多大, 它所谓的"UNDO表空间"就有多大
  2. 因为上述"1"的原因, 所以Oracle当"UNDO表空间爆满"时, 可能会限制了"更大的并发"

不过, PG MVCC实现的缺点是留下了已删除的元组, 即使在所有可能看到这些版本的事务完成后也是如此.
如果没有清理, 哪些"死元组"(对于任何事务实际上是不可见的)将永远留在数据文件中. 对于DELETE和UPDATE比较多的表, 死元组可能占据很多磁盘空间. 同时, 死元组也将从索引中引用, 进一步增加了浪费的磁盘空间量.这就是我们在PG中称之为"膨胀"的东西, 同时因为查询也会变慢.

参考

PostgreSQL Autovacuum基础知识

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值