从 postgresql 文档中,我知道 vacuum 可以跳过可见性映射中已经标记的页面,因此 vacuum 进程只会对需要 vacuum 的页面进行 vacuum,我们称之为部分 vacuum;有时一个表的所有页恰好需要清理死行版本,我们称这个为整表清理(不是清理完全清理),我的问题是:如何判断一个清理是局部清理还是整表清理,如下是vacuum verbose commond的输出,我们可以从中判断吗?
--vacuum 冗长 mydb=> 真空详细 test_vacuum2; 信息:吸尘“mydb.test_vacuum2” 信息:“test_vacuum2”:在 5 页中的 5 页中找到 0 个可移动、774 个不可移动的行版本 详细信息:尚无法删除 0 个死行版本。 有 226 个未使用的项目指针。 0 页完全是空的。 CPU 0.00s/0.00u sec elapsed 0.00 sec. 真空
我不认为您可以从“详细”列表中判断是否有任何页面被跳过,因为已知它们只包含可见的元组。
我认为,如果它决定冻结表中的元组,它只会清理标记为“所有可见”的页面,这可能是因为接近事务回绕,也可能是因为您明确地
VACUUM
使用该FREEZE
选项运行。(如果您使用vacuumdb
命令行可执行文件,这是一个-F
选项。)在我们的商店中,我们
VACUUM FREEZE ANALYZE
在非高峰时段使用数据库中的计划来补充 autovacuum 活动。这最大限度地减少了高峰时段 autovacuum 的开销,并略微提高了查询性能,因为可见性检查更简单。