手动吸尘有效,但自动吸尘不起作用

时间:2019-07-11 12:19:36

标签: postgresql vacuum autovacuum

我有一张桌子,上面有大约2个紫胶(200.000)行。在该表上执行恒定的DML操作。最近出现了一个问题,其中pgAdmin->属性->估计行数显示1 Cr 5 Lac记录左右,并且应用程序无法执行DML操作。

我还看到大约有7个紫胶死元组。几乎每分钟都会运行一次autovaccum。但是死去的水坑并没有被吸尘。为了解决这个问题,我创建了一个虚拟表,将数据迁移到虚拟表,将当前表截断,然后将数据迁移到源表。这确实解决了该问题,并且应用程序能够执行DML操作。但是,

之后,我计划更改autovacuum的默认参数。我运行以下查询:-

ALTER TABLE x_msgs SET (autovacuum_vacuum_scale_factor = 0, 
                        autovacuum_vacuum_threshold = 1000, 
                        autovacuum_analyze_scale_factor = 0, 
                        autovacuum_analyze_threshold = 1000);

上面的查询没有任何改变。然后我尝试了

ALTER TABLE x_msgs SET (autovacuum_vacuum_cost_limit=1800);

但是即使如此,也没有产生任何重大影响,我通过运行以下查询确认了这一点。

select relname, n_tup_ins, n_tup_upd, n_tup_del, n_tup_hot_upd, n_live_tup, n_dead_tup 
from pg_stat_all_tables 
where n_dead_tup > 0;

所以我必须每次手动清理和分析。手动清理和分析的确显示正确的估计行(pgAdmin-> properties选项卡),但不会减少无效的元组。

我应该如何设置自动真空以及如何运行手动真空(完全,冻结,分析)?

0 个答案:

没有答案