In multi-version storage, deleting a row records the change without immediately freeing the space. Reclaiming that space is a background job, and when it is skipped the cost shows up slowly.
Deleted does not mean gone Deleted rows do not vanish from a PostgreSQL table at once; they are only marked dead, and the storage they used, along with older versions still needed by other transactions, stays until someone reclaims and reuses it. That is why a table can keep growing in size even when its live row count stays flat, and why a long-running transaction can pin old versions and balloon a database that is quiet on writes. The insight to take away is that reclaiming is not a side effect of deleting; it is a separate, recurring job.
...