Вы можете использовать pg_prewarm для загрузки таблицы в оперативную память перед запуском на ней VACUUM (FULL)
.
Кроме того, обратите внимание, что maintenance_work_mem
настолько большой, насколько это возможно; это ускорит создание индексов.
Обе эти вещи помогут, но нет волшебников c, чтобы сделать это действительно быстро.
Вместо этого вы можете попробовать что-то вроде:
BEGIN;
LOCK oldtab IN SHARE MODE; -- blocks modifications
CREATE TABLE newtab (LIKE oldtab INCLUDING ALL);
INSERT INTO newtab SELECT * FROM oldtab;
/* create indexes and constraints as appropriate */
DROP TABLE oldtab;
ALTER TABLE newtab RENAME TO oldtab;
COMMIT;
Это блокирует SELECT
операторов только на короткое время.