1、vacuum和vacuum analyze和analyze的区别
我们加上verbose打印vacuum过程中的信息,可以发现:
- vacuum analyze过程中不但会vacuum表,还会收集表的统计信息,同时还会在表的年龄超过vacuum_freeze_table_age时,将表的年龄降低到vacuum_freeze_min_age值;
- 而vacuum只会vacuum表,也会在表的年龄超过vacuum_freeze_table_age时,将表的年龄降低到vacuum_freeze_min_age值;
- analyze则只进行表分析
2、vacuum和vacuum freeze的区别
看详细的打印信息,好像vacuum和vacuum freeze差别不大,但实际vacuum freeze会把表的年龄将为0,不管之前年龄多大,即事务回卷;
而vacuum/autovacuum只会在表的年龄超过vacuum_freeze_table_age时,会进行freeze,但是会将表的年龄降低到vacuum_freeze_min_age值而非0(若表的年龄小于vacuum_freeze_table_age,不会触发freeze)
3、vacuum和vacuum full区别
(1)vacuum full 表会释放表文件对应的磁盘空间, 因为表对应的pg_class.relfilenode都变了(vacuum full实质上是重建了整个表,以达到空间合并的效果);
vacuum只是将删除状态的空间释放掉,转换到能够重新使用的状态,但是对于系统来说该数据块的空闲空间并没有反应到系统的元数据中,并不进行空间合并
(2)vacuum full, 就是除了vacuum, 还进行空间合并, 因此它需要lock table
(3)vacuum full 表的情况下, select没法查询表, select会被vacuum full堵塞
不管是vacuum vacuum analyze还是vacuum freeze,更别说vacuum full,都会产生wal日志,也会影响IO和业务,要在业务低峰期进行
还有autovacuum参数,主要关注autovacuum_analyze_scale_factor、autovacuum_vacuum_scale_factor、autovacuum_freeze_max_age、autovacuum_max_workers等,这次将不进行解释