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

时间:2013-03-29 08:44:38

标签: postgresql database-design ddl database-performance postgresql-9.2

所以我有一个包含大型数据集的表,这个表有三列我想放弃 问题是:Postgres将如何处理它?<​​/ p>

它会遍历每个条目还是仅仅更新映射信息而没有太多开销? 我可以制作一个ALTER TABLE,还是应该在这种特殊情况下使用swap-table?

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

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

2 个答案:

答案 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