Postgresql 可移动在Postgres';真空输出?

Postgresql 可移动在Postgres';真空输出?,postgresql,vacuum,Postgresql,Vacuum,我对一个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毫秒内没有结果 “329

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

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

由于我对更改行(更新、删除)的了解非常有限,如果其他事务(在相同的物理位置)正在使用旧版本,则会保留旧版本,而不再有事务需要该行的过时版本-它将变为可移动

抱歉-在文档中找不到清晰的描述


如果我没弄错的话-可移除的由真空的
analyze
部分显示,而死行被移除而不是由实际的
vacuum
部分显示。

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

您可以在Wiki中阅读有关真空的文档以了解更多详细信息:


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

0死区版本尚无法删除。

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

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

看这个