Index-only scans will visit the heap for each tuple until the first VACUUM is done.
The first vacuum will read the entire table, but not need to write it anymore. And will create the _vm file.
I think we really want to create _vm file as well as set PD_ALL_VISIBLE, but I don't know the best way to do that. Set a flag somewhere and then create it in bulk at the end of the transaction? Set it bit by bit as the pages are extended and initialized?
Easy enough to do it at the end of the COPY FREEZE in one step.
Here, we might want to consider that setting bit in visibility map
will generate WAL log whereas Copy Freeze otherwise skip WAL
when wal_level is less than archive. This can lead to extra disk
writes which can slow down Copy Freeze, but OTOH that might
be acceptable.
I'm building the map as I go, in the latest version of this patch I'm working on.
--
Simon Riggs http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services