所以我有一个包含大型数据集的表,这个表有三列我想放弃 问题是:Postgres将如何处理它?</ p>
它会遍历每个条目还是仅仅更新映射信息而没有太多开销?
我可以制作一个ALTER TABLE
,还是应该在这种特殊情况下使用swap-table?
并且,如果它有任何区别,则所有三列都具有固定长度(两个整数和一个数字)。
如果已经被问过我很抱歉,但Google找不到任何相关的问题/文章......
答案 0 :(得分:31)
ALTER TABLE DROP COLUMN只是禁用系统表中的列。它非常快,但它不会从堆文件中删除数据。您必须稍后执行VACUUM FULL以压缩分配的文件空间。所以ALTER TABLE DROP COLUMN非常快。你要压缩文件,你必须调用较慢(使用独占锁定)VACUUM FULL。
答案 1 :(得分:29)
Google可能对此问题毫无用处,但the manual rarely fails:
DROP COLUMN
表单不会物理删除列,但是 只是让它对SQL操作不可见。随后插入和 表中的更新操作将为列存储空值。 因此,删除列很快,但不会立即减少 表的磁盘大小,作为丢弃的空间占用的空间 列未回收。随着时间的推移,这个空间将被回收 现有行已更新。
和
要强制立即重写表格,您可以使用VACUUM FULL, CLUSTER或其中一种强制重写的ALTER TABLE。这个 导致表中没有语义上可见的变化,但是摆脱了 不再有用的数据。
具体而言,系统目录表pg_attribute
中的列attisdropped
设置为TRUE
。