我在Ubuntu上使用PostgreSQL 9.1。是否仍建议使用预定的VACUUM ANALYZE,还是自动抽真空足以满足所有需求?

如果答案是“取决于”,那么:一个大型数据库(压缩后的转储大小为30 GiB,数据目录为200 GiB)
我将ETL导入数据库,每周导入近300万行
变化最频繁的表都继承自主表中,主表中没有数据(数据按周划分)
我创建每小时汇总,然后从那里创建每日,每周和每月报告

我问,因为原定的VACUUM ANALYZE正在影响我的报告。它运行了5个多小时,本周我不得不杀死它两次,因为它影响了常规数据库的导入。 check_postgres不会在数据库上报告任何明显的膨胀,所以这并不是真正的问题。问题在于:我还需要VACUUM ANALYZE吗?

评论

好吧,我会说“不”,但是要详细说明此答案(例如,设置autovacuum参数),则需要在副本数据库上进行一些实验。

#1 楼

VACUUM仅在非临时表中的更新或删除的行上才需要。显然,您正在执行许多INSERT操作,但是从说明中并不能看出您也在执行大量UPDATE或DELETE操作。列。此外,更重要的是,还有一个pg_stat_all_tables列,该列告诉每个表需要清理多少行。 />
您可能的策略是取消预定的VACUUM,关注此视图并检查n_tup_upd显着上升的表。然后,仅将主动式VACUUM应用于这些表。如果有一些大型表的行永远不会被删除或更新,并且只有在较小的表上才需要使用激进的VACUUM,这将是一个成功。 。

评论


Autovacuum还负责ANALYZE。在批量UPDATE / INSERT / DELETE和紧随大查询之后立即运行手动ANALYZE仍然是一个好主意。不过,+ 1是很好的建议。

–欧文·布兰德斯特(Erwin Brandstetter)
2012年6月1日17:00

感谢您指向n_dead_tup的指针和朋友。我确实有汇总表,在该表上我经常(每小时)销毁并重新创建数千行。我将检查这些值并适当安排时间。答案始终是“监视,思考,行动” :)

–FrançoisBeausoleil
2012年6月2日12:44



#2 楼

在您的问题中,我看不到autovacuum无法解决的问题。这在很大程度上取决于您的写作活动方式。您提到每周有300万新行,但是INSERT(或COPY)通常不会创建表和索引膨胀。 (autovacuum只需要处理列统计信息,可见性图和一些次要工作)。 UPDATEDELETE是导致表和索引膨胀的主要原因,尤其是在针对随机行的情况下。我在您的问题中没有发现任何问题。

autovacuum已经走了很长一段路,并且在Postgres 9.1或更高版本中做得很好。我将看看autovacuum的设置。如果吸尘会干扰您的工作负荷,请查看“基于成本的真空延迟”。

如果您有很多随机的UPDATE,则可能需要将FILLFACTOR设置为小于100的值,以便立即进行HOT更新并减少对VACUUM的需求。有关HOT更新的更多信息:


更新语句中的冗余数据

还请注意,临时表需要手动VACUUMANALYZE。我在CREATE TABLE上引用了手册:


autovacuum守护程序无法访问,因此无法清理或
分析临时表。因此,应通过会话SQL命令执行适当的真空和
分析操作。例如,如果要在复杂查询中使用临时表,则
在填充临时表后在临时表上运行ANALYZE是明智的。


#3 楼

尽管我同意使用自动功能最好,而不是在数据库范围内运行,但在大多数情况下,需要对每个表进行调整。和分析,我已经看到了几个实例,在这些实例中,执行大量插入/更新但删除很少的数据库永远不会完成分析并开始表现不佳。

解决方案是进入被使用的表大量查询,并对其进行自动查询设置,然后将这些表的自动分析设置设置为每天或每隔一天进行分析的位置。

您可以在gui中获取每个表的设置在“自动真空”选项卡上,您将看到分析可以独立于真空进行设置的设置。

这些设置最终出现在reloptions表中,并且可以通过查询

SELECT c.relname, c.reloptions FROM pg_class c where reloptions is not null


,进行主动分析的样本值可能是

{autovacuum_enabled=true,autovacuum_analyze_threshold=10,autovacuum_analyze_scale_factor=.01}


要查看上次对表进行自动分析查询的时间

select 
    relname, 
    n_dead_tup, 
    n_tup_ins, 
    n_tup_upd, 
    n_tup_del, 
    last_autoanalyze, 
    autoanalyze_count 
from pg_stat_user_tables 
where last_autoanalyze is not null 
order by last_autoanalyze desc;


评论


如果您不进行分析,PostgreSQL如何知道统计信息已更改?以及如何确定需要很长时间的是ANALYZE?同时,虽然上面提到的GUI尚不清楚,但您可以正确使用特定的每表设置。

– dezso
13年6月13日在20:05