PostgreSql数据表清理

PostgreSql数据表清理


前言:当PostgreSQL数据库中的表进行更新或删除操作时,死亡行( 被称为元组 )会被遗留下来。使用VACUUM会把它们除去,使空间能被重新利用。如果一个表没有被清空,它会变得臃肿,浪费磁盘空间而且会降低顺序表扫描的速度,而且在较小范围内也会降低索引扫描的速度。

数据表收缩用法:

VACUUM [({ FULL|FREEZE|VERBOSE|ANALYZE } [, ...])] [table_name [(column_name [, ...])] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table_name ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table_name [ (column_name [, ...] ) ] ]

栗子:

VACUUM FULL VERBOSE table_name;
VACUUM FULL VERBOSE ANALYZE table_name;

参数解释:

FULL

选择"完全"清理,这样可以恢复更多的空间,但是花的时间更多并且在表上施加了排它锁。 该方法也需要额外的磁盘空间,因为它写了一个表的新拷贝并且不释放旧的拷贝,直到操作完成。 通常这应该只用于当一个大量的空间需要在这个表中回收时。

FREEZE

选择激进的行"冻结"。指定FREEZE相当于执行 VACUUM时将vacuum_freeze_min_age参数设为零。

VERBOSE

为每个表打印一份详细的清理工作报告。

ANALYZE

更新用于优化器的统计信息,以决定执行查询的最有效方法。

table_name

要清理的表的名称(可以有模式修饰)。缺省时是当前数据库中的所有表。

column_name

要分析的具体的字段名称。缺省是所有字段。若指定一个字段列表,就暗含ANALYZE


VACUUM和VACUUM FULL的区别
区别 VACUUM VACUUM FULL
被删除的数据所占用的物理空间是否被重新规划给操作系统。
执行效率 只是状态置为操作,效率较高。 该命令会为指定的表或索引重新生成一个数据文件,并将原有文件中可用的数据导入到新文件中,之后再删除原来的数据文件。因此在导入过程中,要求当前磁盘有更多的空间可用于此操作。因此该命令的执行效率相对较低。
删除大量数据之后 如果删除的记录位于表的末端,其所占用的空间将会被物理释放并归还操作系统。如果不是末端数据,该命令会将指定表或索引中被删除数据所占用空间重新置为可用状态,那么在今后有新数据插入时,将优先使用该空间,直到所有被重用的空间用完时,再考虑使用新增的磁盘页面。 不论被删除的数据是否处于数据表的末端,这些数据所占用的空间都将被物理的释放并归还于操作系统。之后再有新数据插入时,将分配新的磁盘页面以供使用。
在执行VACUUM命令时,是否可以并发执行针对该表的其他操作。 该操作是共享锁,因此可以与其他操作并行进行。 该操作需要在指定的表上应用排它锁,因此在执行该操作期间,任何基于该表的操作都将被挂起,知道该操作完成。
推荐使用方式 为了保证数据表的磁盘页面数量能够保持在一个相对稳定值,可以定期执行该操作,如每天或每周中数据操作相对较少的时段。 考虑到该操作的开销,以及对其他错误的排斥,推荐的方式是,定期监控数据量变化较大的表,只有确认其磁盘页面占有量接近临界值时,才考虑执行一次该操作。即便如此,也需要注意尽量选择数据操作较少的时段来完成该操作。
执行后,其它操作的效率 相比于不执行任何VACUUM操作,其效率更高,但是插入的效率会有所降低。 在执行完该操作后,所有基于该表的操作效率都会得到极大的提升。

你可能感兴趣的:(PostgreSQL数据库,postgresql)