Removable 在 Postgres 的真空输出中意味着什么?

What does removable mean in Postgres' vacuum output?

我 运行 对 Postgres table 有 900 万行的完整 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.

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

由于我的知识有限,当您更改行(更新、删除)时,如果其他交易(在同一物理位置)正在使用旧版本,则当没有更多交易需要过时版本时,将保留旧版本该行 - 它变得可移动。

抱歉 - 在文档中找不到明确的描述

如果我没看错 - 真空的 analyze 部分显示可移动,实际 vacuum 部分显示死行已删除而不显示。

简单的理解就是,当你更新或删除你的table上的数据时,PostgreSQL不会立即删除它,它只是标记它。 Vacuum 命令作为一个垃圾收集器,它将遍历那些 table 并将其删除以恢复磁盘 space。

您可以在 Wiki 中阅读有关 Vacuum 的文档以获取更多详细信息:

https://wiki.postgresql.org/wiki/Introduction_to_VACUUM,_ANALYZE,_EXPLAIN,_and_COUNT

除了其他人已经回答的内容,关于日志中的输出:

0 dead row versions cannot be removed yet.

当对任何行执行 updatedelete 时,将创建该行的新版本,以便在事务提交后替换之前的版本。在执行 update/delete 之前开始的事务可能会继续看到旧行版本(取决于 transaction isolation 级别)。因此 vacuum 无法删除这些版本,直到可以确保它们中的 none 将不再可见。

有关这些情况的日志报告:在您的示例中,没有不能删除的行版本,因为它们可能会被其他事务访问。

看到这个