PostgreSQL Long VACUUM

时间:2009-01-11 21:22:18

标签: postgresql rdbms vacuum

我目前正在清理一个包含2个索引和2.5亿个活动行以及大约尽可能多的死行(或更多行)的表。我从我的客户端计算机(笔记本电脑)向我的服务器发出了命令VACCUM FULL ANALYZE。它在过去3-4天左右开展业务;我想知道它是否会很快结束,因为我还有很多工作要做!

服务器具有四码Xeon 2.66 GHz处理器,12 GB或RAM以及RAID控制器,连接到RAID 1配置中的2 x 10K rpm 146 GB SAS HD;它正在运行Suse Linux。我想知道......

现在,首先,VACUUM postmaster流程似乎只使用了一个核心。其次,我没有看到对I / O空闲时间比率的非常高的I / O写入。第三,通过调用procinfo,我可以推断VACUUM进程花费大部分时间(88%)等待I / 0。

那么为什么不通过线程使用更多内核来使RAID控制器过载(获得高I / O写入空闲比率)?如果I / O负载不高,为什么还在等待I / O?为什么手指上的所有这些功率/资源都不会更快?在我看来,VACUUM可以而且应该是多线程的,特别是如果它在一个巨大的桌子上工作,它是唯一一个工作!

另外,他们是一种配置postgresql.conf以让它多线程化这样的VACUUM的方法吗?我可以杀死它并仍然可以从部分清理中获益吗?我需要在那张桌子上工作。

[我正在使用PostgreSQL 8.1]

再次

4 个答案:

答案 0 :(得分:5)

您没有说明您正在使用的PostgreSQL版本。它有可能是8.0之前的吗?

我有完全相同的情况。你最好的:

  • 杀死真空
  • 使用pg_dump -t选项
  • 备份表格
  • 放下桌子
  • 恢复表格

如果您使用的是8.x,请查看autovacuum选项。真空是单线程的,没有什么可以让它使用多线程。

答案 1 :(得分:4)

一些快速提示:

  • 运行VACUUM FULL VERBOSE,以便了解正在发生的事情。
  • 删除VACUUM之前的所有索引。重建它们比真空更快。您还需要立即重建它们,因为VACUUM FULL不够好(特别是在8.1这样的旧PosgreSQL上)。
  • 将maintenance_work_mem设置得非常高。
  • 使用较新的PostgreSQL。顺便说一句,8.4将在吸尘方面取得巨大进步。

VACUUM的替代方法是转储和恢复。

编辑:自9.0 VACUUM FULL重写整个表格。它与执行转储+恢复基本相同,因此不必运行REINDEX。

答案 2 :(得分:0)

你确定你没有任何可以锁定桌面并阻止真空运行的东西吗?

(无论如何,最好使用vacuum_cost_delay,这样真空不会对生产造成破坏。)

答案 3 :(得分:0)

Old VACUUM FULL是一个化石。它也很慢,之后你得到了REINDEX。不要使用它。如果您真的要对表进行碎片整理,请使用CLUSTER,或者:

假设你剩下一些磁盘空间,这比dump& reload快得多:

CREATE TABLE newtable AS SELECT * FROM oldtable;
CREATE INDEX bla ON newtable( ... );
ALTER TABLE oldtable RENAME TO archive;
ALTER TABLE newtable RENAME TO oldtable;

请注意,这不会复制您的约束。您可以使用CREATE TABLE LIKE ...来复制它们。

  

那么为什么不通过线程使用更多内核

pg不支持此。