在大型数据集上删除Postgres中的列

nik*_*206 24 postgresql ddl database-design database-performance postgresql-9.2

所以我有一个包含大型数据集的表,这个表有三列我想删除.
问题是:Postgres将如何处理它?

它会遍历每个条目还是只是更新映射信息而没有太多开销?ALTER TABLE在这种特殊情况下,我可以只使用或应该使用交换表吗?

并且,如果它有任何区别,则所有三列都具有固定长度(两个整数和一个数字).

如果已经有人问过我很抱歉,但谷歌找不到任何相关的问题/文章......

Pav*_*ule 34

ALTER TABLE DROP COLUMN只是禁用系统表中的列.它非常快,但它不会从堆文件中删除数据.您必须稍后执行VACUUM FULL以压缩分配的文件空间.所以ALTER TABLE DROP COLUMN非常快.你要压缩文件,你必须调用较慢(使用独占锁定)VACUUM FULL.


Erw*_*ter 34

谷歌可能对这个问题毫无用处,但手册很少会失败:

DROP COLUMN形式不物理删除列,但只是让无形的SQL操作.表中的后续插入和更新操作将为列存储空值.因此,删除列很快,但不会立即减少表的磁盘大小,因为已删除列所占用的空间不会被回收.随着现有行的更新,该空间将随着时间的推移而被回收.

和:

要强制立即重写表,可以使用VACUUM FULL,CLUSTER或其中一种强制重写的ALTER TABLE形式.这导致表中没有语义上可见的变化,但摆脱了不再有用的数据.

具体而言,attisdropped系统目录表中的列pg_attribute设置为TRUE.

  • 有趣的是,因为行更新现在会在已删除的列中"存储"NULL.并且因为postgresql通过在可选的"空位图"中设置一个位来存储空值,所以_every_行现在必须具有空位图(对于每八个丢弃或未丢弃的列,大小为一个字节),即使所有可见行都不是空值 (6认同)