Visibility Map笔记
【参考】
https://www.interdb.jp/pg/pgsql06.html#_6.1.
【背景】
1)pg8.4引入,为了降低vacuum的代价
page的vm可见性决定了vacuum是否跳过这个page
2)pg9.6加强了vm的功能,包含了tuples是否被frozen的信息
【freeze流程】
1)lazy模式
扫描仅仅含dead tuples的页
如果当前事务id是 50,002,500
the freezeLimit txid=50,002,500- 50,000,000=2500,#freezeLimit_txid=(OldestXmin−vacuum_freeze_min_age)
第0页:Three tuples are frozen because all t_xmin values are less than the freezeLimit txid. In addition, Tuple_1 is removed in this vacuum process due to a dead tuple.
第1页:This page is skipped by referring to the VM.
第2页:Tuple_7 and Tuple_8 are frozen; Tuple_7 is removed.
由于会跳过页,所以可能不会 freeze tuples completely
2)eager模式
扫描所有页
2.1)触发条件
pg_database.datfrozenxid<(OldestXmin−vacuum_freeze_table_age)
举例
pg_database.datfrozenxid are 1821
OldestXmin is 150,002,000
the freezeLimit txid is 100,002,000.
【6.3.3 用vm改善eagerMode的freeze流程】
增加了all frozen的标记位
第0页不需要扫描
第1页扫描完后,更新标记位置,下一次不用扫描
【6.4移除不需要的clog文件】
If the minimum pg_database.datfrozenxid is contained in the clog file '0002', the older files ('0000' and '0001') can be removed