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中称之为"膨胀"的东西, 同时因为查询也会变慢.