Thom Brown <thom@linux.com> writes:
> There are 2 possibilities I can think of:
> 1) The application which inserts the rows still has the transaction
> open that inserted all the rows, and hasn't yet committed.
> 2) A transaction is open, but another transaction has since deleted
> all the rows and committed, and the open transaction still has
> visibility of the rows, so they can't be cleaned up by a vacuum
> process.
"VACUUM VERBOSE <table>" would likely be informative. I don't think
it will distinguish which of those things has happened, but it would
confirm the idea that there are a bunch of not-visible-to-you rows.
It might be a good idea to check for old prepared transactions, as
well as old idle-in-transaction sessions.
regards, tom lane