PostgreSQL VACUUM Reclaims Space Without Giving the File Back to the Filesystem
Standard VACUUM makes dead-tuple space reusable inside a table. It usually does not shrink the table file, which is why a successful vacuum and unchanged disk usage can both be correct.