2

我已经对一个有 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.

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

4

3 回答 3

2

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

0 dead row versions cannot be removed yet.

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

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

请参阅此相关问题

于 2017-09-13T07:12:29.633 回答
2

简单来说,您可以理解,当您更新或删除表上的数据时,PostgreSQL 不会立即删除它,它只是标记它。Vacuum 命令就像一个垃圾收集器,它会遍历这些表并将其删除以回收磁盘空间。

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

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

于 2017-06-28T08:41:52.713 回答
2

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

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

如果我做对了 - 可移动显示analyze为真空的一部分,而死行被删除而不是由实际vacuum部分显示。

于 2017-06-28T08:24:42.200 回答