# Every UPDATE Leaves a Ghost: MVCC, Bloat, and VACUUM in PostgreSQL

DevFeed: [Every UPDATE Leaves a Ghost: MVCC, Bloat, and VACUUM in PostgreSQL](<https://devfeed.tech/articles/every-update-leaves-a-ghost-mvcc-bloat-and-vacuum-in-postgresql-2332.md>)

Original publisher: [Read original article](<https://planetscale.com/blog/postgresql-mvcc>)

Author: Ahmed Darwich

Published: 2026-07-20T00:00:00Z

Content type: article

Language: en

Sources: [Blog -- PlanetScale](<https://devfeed.tech/sources/blog-planetscale.md>)

Topics: [Database](<https://devfeed.tech/topics/database.md>)

Tags: [concurrency](<https://devfeed.tech/tags/concurrency.md>), [database](<https://devfeed.tech/tags/database.md>), [deep-dive](<https://devfeed.tech/tags/deep-dive.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [postgres](<https://devfeed.tech/tags/postgres.md>), [postgresql](<https://devfeed.tech/tags/postgresql.md>), [transactions](<https://devfeed.tech/tags/transactions.md>), [update](<https://devfeed.tech/tags/update.md>), [updates](<https://devfeed.tech/tags/updates.md>)

## AI overview

An in-depth PostgreSQL article on MVCC: how concurrent transactions use row versions and snapshot visibility, why updates leave dead tuples, and how this can cause table bloat before VACUUM reclaims space.

## Source excerpt

What happens to old row versions after nobody needs them? They become dead tuples, and over time they bloat your tables. Go deeper into PostgreSQL MVCC with runnable psql examples.