PG MVCC 与 Oracle MVCC实现机制的背后思想差异
在PG中执行DELETE时, 行不会立即从数据文件中删除, 而是仅通过在页头中设置为xmax字段将其标记为已删除. 同样对于UPDATE, 它可能在PG中被视为DELETE + INSERT.
这就因为PG MVCC背后的基本思想之一, 因为它有如下好处:
- 允许更大并发
- 支持更大的UPDATE操作
- 在不同的进程之间最小的锁定
Oracle 也实现了MVCC, 不过Oracle中, 所谓的"死元组"不是存放的数据文件, 而是独立存放的"UNDO 回滚段表空间"中的, 相比PG, 存在如下缺点:
- 一个事务如果存在大量的更新操作, 可能会导致"UNDO表空间爆满", 而PG显然不存在这样的问题, 数据存储空间有多大, 它所谓的"UNDO表空间"就有多大
- 因为上述"1"的原因, 所以Oracle当"UNDO表空间爆满"时, 可能会限制了"更大的并发"
不过, PG MVCC实现的缺点是留下了已删除的元组, 即使在所有可能看到这些版本的事务完成后也是如此.
如果没有清理, 哪些"死元组"(对于任何事务实际上是不可见的)将永远留在数据文件中. 对于DELETE和UPDATE比较多的表, 死元组可能占据很多磁盘空间. 同时, 死元组也将从索引中引用, 进一步增加了浪费的磁盘空间量.这就是我们在PG中称之为"膨胀"的东西, 同时因为查询也会变慢.
本文探讨了PostgreSQL(PG)和Oracle的多版本并发控制(MVCC)机制的实现差异。PG通过在页头设置xmax字段标记元组为已删除,支持高并发和大型更新操作,但可能导致数据膨胀。Oracle则将死元组存放在独立的UNDO表空间,存在UNDO空间溢出的风险,限制并发能力。
1317

被折叠的 条评论
为什么被折叠?



