vacuum的工作内容为空间清理,最主要的工作内容为将数据块中被删除的行的空间进行释放。
比如当前的数据块存在两行数据,用户对最下面一行数据做了修改,PolarDB的操作方式不是在当该行进行修改,而是将该行标识为删除,然后在数据块里重新插入修改后的新行。被标识为删除的行不会立刻释放空间,而是需要由vacuum来做释放操作。
另外,vacuum还负责冷冻老的Txid以及收集表的统计信息,为优化器提供可用信息做参考,并且更新表的文件。
vacuum的操作过程分为三部分。
第一部分,准备创建死元组列表。需要从各个数据库里搜索哪些表达到了整理的条件,然后将这些表组成列表。
第二部分,清理阶段。将列表里包含有被删除的行的空间进行释,同时更新FSM和VM两个文件。
第三部分,善后工作。如果最后一页没有元组,则将其删除,以减少数据文件的尺寸。如果需要,同时会将不必要的Clog删除。
比如上图中第一个数据块内有三行,其中有一行已被删除,PolarDB将其标识为dead tuple。做完vacuum以后,Tuple_2的空间被释放,剩余两行被整理后更加紧凑。同时,被删除行的指针没有删除,插入新行后,该指针会指向新行,减少了维护操作,提高了效率。
接下篇:https://developer.aliyun.com/article/1223090?groupCode=polardbforpg