PG MVCC 與 Oracle MVCC實現機制的背後思想差異

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基礎知識

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章