PostgreSQL可见性映射VM
1.可见性映射
清理过程的代价高昂,为了减小清理的开销,在PostgreSQL 8.4版中引入了VM。
VM的基本概念很简单。 每个表都拥有各自的可见性映射,用于保存表文件中每个页面的可见性。 页面的可见性确定了每个页面是否包含死元组。清理过程可以跳过没有死元组的页面。清理过程为指定的表,或数据库中的所有表执行以下任务。
图1-1 VM的使用方式
2.改进的VM
因为它始终会扫描所有页面。尽管一个页中所有元组都被冻结,也会被扫描。
为了解决这一问题,9.6版本改进了可见性映射VM与冻结过程。新VM包含着每个页面中所有元组是否都已被冻结的信息。在迫切模式下进行冻结处理时,可以跳过仅包含冻结元组的页面。
图2-1 改进的VM
根据VM中的信息,冻结此表时会跳过第0页。在更新完1号页面后,相关的VM信息会被更新,因为该页中所有的元组都已经被冻结了。该伪码分为两大块:一块是依次处理表的循环,一块是后处理逻辑。而循环块又能分为三个部分,每一个部分都有各自的任务。接下来会描述这三个部分,以及后处理的逻辑。