Отбрасывание столбца в Postgres на большом наборе данных

Итак, у меня есть таблица с большим набором данных, и в этой таблице есть три столбца, которые я хотел бы удалить. Вопрос в том, как будут обрабатывать Postgres?

Будет ли он проходить через каждую запись или будет ли он просто обновлять информацию о карте без значительных издержек? Могу ли я просто создать ALTER TABLE или использовать swap-таблицу в этом конкретном случае?

И, если это имеет значение, все три столбца имеют фиксированную длину (два целых числа и один числовой).

Прошу прощения, если это уже было задано, но Google не смог найти связанных вопросов/статей...

Ответ 1

ALTER TABLE DROP COLUMN просто отключает столбцы в системных таблицах. Это очень быстро, но не удаляет данные из файлов кучи. Вы должны сделать VACUUM FULL позже для компактного выделенного файлового пространства. Таким образом, ALTER TABLE DROP COLUMN работает очень быстро. И вы, вы должны компактные файлы, вы должны звонить медленнее (с эксклюзивным LOCK) VACUUM FULL.

Ответ 2

Google может быть бесполезным для этого вопроса, но руководство редко выходит из строя:

Форма DROP COLUMN физически не удаляет столбец, но просто делает его невидимым для операций SQL. Последующая вставка и операции обновления в таблице будут хранить нулевое значение для столбца. Таким образом, падение столбца происходит быстро, но оно не сразу уменьшает размер диска на вашем диске, так как пространство, занятое отбрасываемым колонка не исправлена. Пространство будет исправлено с течением времени, поскольку существующие строки обновляются.

и

Чтобы принудительно переписать таблицу, вы можете использовать VACUUM FULL, CLUSTER или одну из форм ALTER TABLE, которая заставляет переписать. Эта не приводит к получению семантически видимых изменений в таблице, но устраняет не более полезных данных.

В частности, столбец attisdropped в таблице системного каталога pg_attribute установлен на TRUE.