There are some aspects of VACUUM that are complex to explain why they exist, though have some occasional negative behaviors. Let's look more deeply at those and find some solutions.
PostgreSQL performs regular sweeps to clean out old transaction identifiers, which is known as "freezing". It does this to defer transaction wraparound, which is discussed in more detail in the next recipe.
There are two routes that a row can take in PostgreSQL: the row version dies and needs to be removed by VACUUM, or a row version gets old enough to need to be frozen, also performed by the VACUUM process.
Why do we care? Say we load a table with 100 million rows. Everything is fine. When those rows have been ...