Postgres'可删除意味着什么?真空输出?

时间:2017-06-28 08:02:52

标签: postgresql vacuum

我已经在一个包含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.

我的表已编入索引,并且具有主键,但对其执行查询的速度非常慢。

3 个答案:

答案 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.

在任何行上执行updatedelete时,会创建该行的新版本,以便在提交事务后替换上一行。在执行更新/删除之前启动的事务可能会继续查看旧行版本(取决于transaction isolation级别)。因此,真空无法移除这些版本,直到可以确保它们都不再可见。

记录有关这些案例的报告:在您的示例中,没有行版本无法删除,因为它们可能被其他事务访问。

请参阅此related question