我有一张桌子,上面有大约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选项卡),但不会减少无效的元组。
我应该如何设置自动真空以及如何运行手动真空(完全,冻结,分析)?