"David Esposito" <dvesposito@newnetco.com> writes:
> That's why I isolated it down to a standalone example ... There is no other
> process looking at that table ... no foreign keys or other things that could
> cause those records to be "in use" ...
Whether there *is* something looking at that table is not the issue.
The issue is whether there is an open transaction old enough that if
it chose to look at the table, it would see now-deleted rows. If so,
VACUUM can't remove those rows, since it doesn't have any way to know
whether the old transaction will later choose to look.
Given your later message, I suspect there was such an open transaction
and it exited. There is not any really good way to look for this
situation, although the pg_stat_activity view (in 7.2) is better than
nothing. Perhaps in future releases, we should add columns to
pg_stat_activity that would indicate how old each backend's open
transaction is.
regards, tom lane