定期使用Vacuum analyze tablename 回收垃圾和收集统计信息,尤其在大数据量delete和update,或者导入以后,非常重要。

vacuum分两种,一种是analyze,优化查询计划的。还有一种是清理垃圾数据。

postres删除工作,并不是真正删除数据,而是在被删除的数据上,坐一个标记,只有执行vacuum后,才会真正的把物理空间释放,这个非常重要,有些经常更新的表,各种查询、更新效率会越来越慢,这个多是因为没有做vacuum的原因。


下面看一个例子


create table dw_temp.category_detail_test as select * from dw_stage.category_detail;

select count(1) from dw_temp.category_detail_test;

--9800

select pg_relation_size('dw_temp.category_detail_test');

--2228224

delete from dw_temp.category_detail_test where category_id<99999;

--查询成功: 共计 3805 行受到影响,耗时: 15 毫秒(ms)。

select pg_relation_size('dw_temp.category_detail_test');

--2228224

vacuum dw_temp.category_detail_test;

select pg_relation_size('dw_temp.category_detail_test');

该动作会消耗系统一定的资源,引起系统的IO上升,对有一定系统瓶颈来说容易造成堵塞,严重会把GP宕掉,造成数据库瞬断。