VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table ] VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ]
选择"完全"清理,这样可以恢复更多的空间, 但是花的时间更多并且在表上施加了排它锁.
选择激进的元组"冻结".
为每个表打印一份详细的清理工作报告.
更新用于优化器的统计信息,以决定执行查询的最有效方法.
要清理的表的名称(可以有大纲修饰).缺省时是当前数据库中的所有表.
要分析的具体的列/字段名称.缺省是所有列/字段.
命令完成.
表 table 的报告头.
表 table 自身的分析数据.
目标表的索引的分析.
VACUUM 回收已删除元组占据的存储空间. 在一般的 PostgreSQL 操作里,那些 已经 DELETE 的元组或者被 UPDATE 过后过时的元组是没有从它们所属 的表中物理删除的;在完成 VACUUM 之前它们仍然 存在.因此我们有必须周期地运行 VACUUM, 特别是在常更新的表上.
如果没有参数,VACUUM 处理当前数据库里每个表, 如果有参数,VACUUM 只处理那个表.
VACUUM ANALYZE 先执行一个 VACUUM 然后是给每个选定的表执行一个 ANALYZE. 对于日常维护脚本而言,这是一个很方便的组合.参阅 ANALYZE 获取更多有关其处理的细节.
简单的 VACUUM (没有FULL) 只是简单地回收空间并且令其可以再次使用.这种形式的命令 可以和对表的普通读写并行操作,因为没有请求排他锁.VACUUM FULL 执行更广泛的处理,包括跨块移动元组,以便把表压缩到最少的磁盘块数目里. 这种形式要慢许多并且在处理的时候需要在表上施加一个排它锁.
FREEZE 是一种特殊用途的选项,它导致元组尽可能快地 标记为"冻结(frozen)",而不是等到它们已经相当老的时候 才标记.如果在同一个数据库上没有其它运行着的事务的时候完成这个命令, 那么系统就保证在数据库里的所有元组都是"冻结(frozen)"的, 因此不会有事务 ID 重叠的问题,而和数据库未清理的时间没有关系. 我们不建议把 FREEZE 用做日常用途.我们用它的唯一 目地是准备和用户定义的模板数据库联接的时候,或者是其它完全是只读的, 不会等到日常维护性 VACUUM 操作的数据库. 参阅管理员手册获取细节.
下面是一个在 regression (蜕变)数据库里某个表上执行 VACUUM的一个例子:
regression=> VACUUM VERBOSE ANALYZE onek; INFO: --Relation onek-- INFO: Index onek_unique1: Pages 14; Tuples 1000: Deleted 3000. CPU 0.00s/0.11u sec elapsed 0.12 sec. INFO: Index onek_unique2: Pages 16; Tuples 1000: Deleted 3000. CPU 0.00s/0.10u sec elapsed 0.10 sec. INFO: Index onek_hundred: Pages 13; Tuples 1000: Deleted 3000. CPU 0.00s/0.10u sec elapsed 0.10 sec. INFO: Index onek_stringu1: Pages 31; Tuples 1000: Deleted 3000. CPU 0.01s/0.09u sec elapsed 0.10 sec. INFO: Removed 3000 tuples in 70 pages. CPU 0.02s/0.04u sec elapsed 0.07 sec. INFO: Pages 94: Changed 0, Empty 0; Tup 1000: Vac 3000, Keep 0, UnUsed 0. Total CPU 0.05s/0.45u sec elapsed 0.59 sec. INFO: Analyzing onek VACUUM