接上篇:https://developer.aliyun.com/article/1223090?spm=a2c6h.13148508.setting.22.44ec4f0eNvAByn
做完冻结后,所有数据库的列均会写上被冻结时的ID,等下一次发生急性冻结时,ID会被更新。
查询结果如上图,比如id=651意味着该表没有被冻结,此id为事务创建时的id。而id=0意味着数据库是初始化时创建的。
为了提高急性冻结的效率,PolarDB在VM上又做了改进。
上次冻结后(包括惰性冻结与急性冻结)至今没有发生变化的,状态为1;上次惰性冻结没有发生的,状态为0;冻结后发生变化的,状态为0。
做急性冻结时,状态为1则跳过,状态为0则进行急性冻结,以减少冻结工作量。
PolarDB9.6以后,提供了专门的后台进程做autovacuum。默认每10分钟执行一次,由autovacuum参数定义间隔时间。
每次做vacuum时,默认用三个worker进程,每个进程同一时间只能负责一个数据库里的表。如果想增加autovacuum的进程数,可以通过autovacuum_max_workers参数进行修改。
vacuum分为普通vacuum和Full Vacuum。
上图为普通vacuum操作。比如当前有三个块,紫色标示都是被删除的行。做了普通vacuum以后,三个块均保留,但里面只有少量数据。
为了减少数据文件的尺寸,可以做Full Vacuum。将块中被删除的行的空间清理后,会再新建一个数据文件,为其分配一个块。然后将剩下的行放入新的数据文件的块中,将原来的数据文件删除。
如果检测到数据块很多,且每个块内的可用空间也很多时,建议做Full Vacuum。
比如上图,表中一共有1640个数据块,每个数据块内的可用空间为99个字节。
对该表做delete操作并进行普通vacuum后,每个块的可用空间为7124字节,空闲率达86.97%。
而对该表做Full Vacuum后,表内只剩164个数据块,且每个块内的可用空间为0,数据文件的尺寸大幅降低。
如上图所示,表内原先有94个块,做完普通vacuum后依然为94个块,但是做了Full Vacuum后,只剩10个块。
将来做全表扫描时,扫描量从94个块降低至10个块,扫描效率得到了极大提升。