我对一个有900万行的Postgres表进行了全真空操作,并得到了以下结果:
INFO: vacuuming "osm.asp_trs_roads_osm"
INFO: "asp_trs_roads": found 329992 removable, 9660438 nonremovable row versions in 761738 pages详细信息:尚不能删除0个死行版本。CPU 8.98s/13.06u秒已过去549.77秒。991788毫秒后查询返回成功,无结果。
"329992可拆卸“是什么意思?为什么我会得到:
0 dead row versions cannot be removed yet.我的表是有索引的,并且有主键,但是在它上面执行查询非常慢。
发布于 2017-06-28 16:24:42
根据我的一般知识,当您更改行(更新、删除)时,如果其他事务正在使用旧版本(在相同的物理位置),则保留旧版本,当不再有事务需要行的过时版本时-它将变为可删除的。
抱歉-在文档中找不到清晰的描述
如果我没弄错的话--可拆卸的部分由vacuum的analyze部分显示,而死行的移除和不显示则由实际的vacuum部分显示。
发布于 2017-06-28 16:41:53
简单地说,您可以理解,当您更新或删除表中的数据时,PostgreSQL不会立即删除它,而只是标记它。Vacuum命令是一个垃圾收集器,它将遍历这些表并删除它以恢复磁盘空间。
您可以在Wiki中阅读有关Vacuum的文档,了解更多详细信息:
https://wiki.postgresql.org/wiki/Introduction_to_VACUUM,_ANALYZE,_EXPLAIN,_and_COUNT
发布于 2017-09-13 15:12:30
除了其他人已经回答的问题之外,关于日志中的以下输出:
0 dead row versions cannot be removed yet.
当在任何行上执行update或delete时,将创建该行的新版本,以便在提交事务后替换以前的版本。在执行update/delete之前启动的事务可能会继续看到旧的行版本(取决于transaction isolation级别)。因此,在确保这些版本不再可见之前,vacuum无法删除这些版本。
记录有关这些情况的报告:在您的示例中,没有不能删除的行版本,因为它们可能会被其他事务访问。
请参阅此related question。
https://stackoverflow.com/questions/44796837
复制相似问题