1. 查看FSM 和 VM 文件
在之前我们了解了opengauss的物理机构和逻辑结构,如下:
openGauss 数据库 逻辑结构 说明
https://www.cndba.cn/dave/article/116485
openGauss 数据库 物理(目录)结构 说明
https://www.cndba.cn/dave/article/116484
在查看目录的时候,我们会发现创建的数据库目录下面,会发现很多文件名带有 _fsm和_vm。
[dave@www.cndba.cn 15486]$ pwd
/data/openGauss/install/data/dn/base/15486
[dave@www.cndba.cn 15486]$ ll *m
-rw------- 1 omm dbgrp 24576 Feb 19 16:38 14895_fsm
-rw------- 1 omm dbgrp 8192 Feb 19 16:38 14895_vm
-rw------- 1 omm dbgrp 24576 Feb 28 12:30 14906_fsm
-rw------- 1 omm dbgrp 8192 Feb 25 11:34 14906_vm
-rw------- 1 omm dbgrp 24576 Feb 19 16:38 14908_fsm
-rw------- 1 omm dbgrp 8192 Feb 19 16:38 14908_vm
-rw------- 1 omm dbgrp 24576 Feb 19 16:38 14984_fsm
-rw------- 1 omm dbgrp 8192 Feb 19 16:38 14984_vm
-rw------- 1 omm dbgrp 24576 Feb 19 16:38 14988_fsm
-rw------- 1 omm dbgrp 8192 Feb 19 16:38 14988_vm
-rw------- 1 omm dbgrp 24576 Feb 19 16:38 14990_fsm
-rw------- 1 omm dbgrp 8192 Feb 19 16:38 14990_vm
-rw------- 1 omm dbgrp 24576 Feb 19 16:38 15004_fsm
-rw------- 1 omm dbgrp 8192 Feb 19 16:38 15004_vm
-rw------- 1 omm dbgrp 24576 Feb 19 16:38 15020_fsm
-rw------- 1 omm dbgrp 8192 Feb 19 16:38 15020_vm
-rw------- 1 omm dbgrp 24576 Feb 19 16:38 15027_fsm
-rw------- 1 omm dbgrp 8192 Feb 19 16:38 15027_vm
-rw------- 1 omm dbgrp 24576 Feb 19 16:38 15040_fsm
-rw------- 1 omm dbgrp 8192 Feb 19 16:38 15040_vm
-rw------- 1 omm dbgrp 24576 Feb 19 16:38 15044_fsm
-rw------- 1 omm dbgrp 8192 Feb 19 16:38 15044_vm
openGauss=# select pg_relation_filepath('cndba');
pg_relation_filepath
----------------------
base/15486/16403
(1 row)
[dave@www.cndba.cn dn]$ ls base/15486|grep 16403*
16403
16403_fsm
2. 空闲空间映射(FSM:Free Space Maps )
每一个表和索引(除了哈希索引)都有一个空闲空间映射(FSM)来保持对关系中可用空间的跟踪;它伴随着主关系数据被存储在一个独立的关系分支中,以关系的文件节点号加上一个_fsm后缀命名。
比如我们上面表的文件节点(relfillenode)是16403,那么FSM被存储在一个名为16403_fsm的文件中,该文件与主关系文件在同一个目录中。FSM 文件使用的是树形结构来记录空闲的页块,也是从左到右的查找。
这里要注意并不是在建表时就创建 FSM 文件和VM文件,而是在执行VACUUM操作时,或为了插入行而第一次查询FSM文件时才会创建。 因此有些表并没有FSM 和 VM 文件。
在PG 8.3时fsm是存储在share memory 中的,并且他是一个固定的尺寸,当数据库有大量的删除和更新一集回滚的操作时,很可能因为fsm的问题,造成不能在记录正确的free space。正是因为这个原因,后面的PG 将_fsm 变成了文件,并且其中文件记录了max_fsm_pages 和 max_fsm_relations 。
3. 可见性映射(VM:Visual Map )
每一个表都有一个可见性映射(VM)用来跟踪哪些页面只包含已知对所有活动事务可见的元组,它也跟踪哪些页面只包含未被冻结的元组;它伴随着主关系数据被存储在一个独立的关系分支中,以该关系的文件节点号加上一个_vm后缀来命名。
比如我们之前查询的文件节点为15044,其VM被存储在名为15044_vm的文件中,该文件域主关系文件在同一个目录中。
注意索引没有VM。
VM文件中为每个数据块设置了一个标志位,用来标记数据块中是否存在需要清理的行。有了这个文件后,通过VACUUM命令扫描这个文件时,如果发现VM文件中这个数据块上的位表示该数据块没有需要清理的行,则会跳过对这个数据块的扫描,从而加快VACUUM清理的速度。
通俗一点理解就是在update, delete行后,这些行tuple 并不会马上被清理掉,而是要通过vacuum ,autovacuum 等操作将这些dead tuple 来清理, vm文件的主要作用是显示占用的tuple ,扫描的时候会跳过这些tuple。
PostgreSQL Vacuum 说明
https://www.cndba.cn/dave/article/116401
版权声明:本文为博主原创文章,未经博主允许不得转载。