我已经在一个包含900万行的Postgres表中运行了一个完整的VACUUM,我得到了回复:
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.
我的表已编入索引,并且具有主键,但对其执行查询的速度非常慢。
答案 0 :(得分:2)
由于我更改行(更新,删除)时我的知识非常多,如果其他事务(在相同的物理位置)正在使用旧版本,则不再需要过时的版本行 - 它变得可以移动。
抱歉 - 在文档中找不到清晰的描述如果我做得对 - 可移动的是analyze
部分真空显示,并且已删除死行而不是实际的vacuum
部分显示。
答案 1 :(得分:2)
以简单的方式,您可以理解,当您更新或删除表上的数据时,PostgreSQL不会立即将其删除,只是标记它。 Vacuum命令作为垃圾收集器,它将通过这些表并将其删除以恢复磁盘空间。
您可以在Wiki中阅读有关Vacuum的文档以获取更多详细信息:
https://wiki.postgresql.org/wiki/Introduction_to_VACUUM,_ANALYZE,_EXPLAIN,_and_COUNT
答案 2 :(得分:2)
除了其他人已经回答的内容,关于日志中的此输出:
0 dead row versions cannot be removed yet.
在任何行上执行update
或delete
时,会创建该行的新版本,以便在提交事务后替换上一行。在执行更新/删除之前启动的事务可能会继续查看旧行版本(取决于transaction isolation级别)。因此,真空无法移除这些版本,直到可以确保它们都不再可见。
记录有关这些案例的报告:在您的示例中,没有行版本无法删除,因为它们可能被其他事务访问。
请参阅此related question。