目录
并发清理的过程如下:
VM,可见性映射,是为了减少冻结与清理的时间。
页面的可见性确定了每个页面是否包含死元组,清理过程可以跳过没有死元组的页面。后面版本的Pg中,VM也包含页面是否全部冻结的信息。
根据VM扫描清理包含死元组的表。过程:
根据VM,扫描不可见页面,根据a=b-c,b为当前事务id,c为固定值,可配置,a及之前的事务元组都需要被冻结,并一边移除死元组。当一个页面中所有元组都被冻结,那么该页面也就是一个可见页面。
惰性模式不能动结那些很久以前但是没有死元组的事务元组页。
扫描所有的表,并删除不必要clog
为了弥补惰性清理的缺点,迫切模式扫描所有元组,不管是全页可见的还是不可见的(因为它根本不会根据VM可见性来扫描),冻结的还是没冻结的,比如,冻结完一章表中10200事务之前的元组后,更新该表的f值,表示该表最新的不可见的事务Id为10200。而整个数据库的F值为所有表的最小f值。
迫切模式的缺点是,即使一个页已经全员可见了,还是会扫描一遍。
9.6版为了改进迫切模式,改进后的迫切模式会先扫描VM,并会跳过已经全员可见的页(即全员已经被冻结,在重复一遍,被冻结不会有死元组)
上面提到的数据库中的F值存储这所有数据表中最旧的可能存在不可见元组的事务id,即事务id之前的事务所操作的元组已经全部可见,不可见的元组也已全部被清理,那么存储事务id之前的clog文件与页面就可以被删除了。
系统每隔一段时间(默认情况为每分钟一次,可配置)启动一次自动并发清理。
前面说的都是并发清理,但是并发清理之后还得整理:
创建新的表,将活元组从各个页面中复制到新表,删除旧文件,重建索引并更新统计信息FSM与VM。这个是很耗时的,而且在完整清理时其他事务不能访问表。
何时启动完整清理:通过pg_freespacemap扩展查看各个页的空置率来决定。