1) if that records did not contain BLOB values, then compact can do nothing.
As far as I remember compact() do not try to move records of a Table into deleted places.
But it does this for BLOB fields (deleted values) AND for deleted internal logical files, e.g. after DELETE some column, index or table.
2) If you have to delete N records in a Table, then you really should use Clone() to get totally "clean"
Clone() do the additional job, moving records, it builds special maps of changed RecIDs, etc.
3) Do you mean you want Compacting of a db under working VSERVER?
Well, this should be a feature request. We ware going do something similar.
4) I wonder why you think this is a required step?
After deleting 20K records, I think users will start to add new records and they will automatically reuse that empty space.