一、轻量级清理
触发条件:当查询扫描到某个Astore的对标页面是,会顺带尝试清理页面上已经被清理且元组对所有并发查询不可见;
清理内容:一般只清理元组内容,不清理元组指针(除了HOT)
清理接口:heap_page_prune_opt
局限:清理后的空间仍然只能该表使用
二、中量级清理
触发条件:仅VACUUM
清理内容:先清理索引中的元组再清理堆表中的元组
清理接口:lazy_vacuum_rel,内部逐层调用lazy_scan_rel、lazy_scan_heap、heap_page_prune
局限性:清理出的空间只能被该表使用
三、重量级清理
触发条件:VACUUM FULL
清理内容:将一个表里未死亡的元组重新紧密插入到新的堆表文件并在此基础上重新创建素有使用。
清理接口cluster_rel,内部逐层调用 rebuild_relation、copy_heap_data、tableam_relation_copy_for_cluster、heapam_relation_copy_for_cluster、copy_heap_data_internal、reform_and_rewrite_tuple、rewrite_heap_tuple
局限性:在重量级清理的主体流程中只允许用户执行只读查询操作,在重量级清理的提交流程中只读查询操作也会被阻塞。