签到成功

知道了

CNDBA社区CNDBA社区

openGauss 空闲空间映射(FSM) 和 可见性映射(VM) 说明

2023-03-11 23:36 712 0 原创 openGauss
作者: dave

1. 查看FSM 和 VM 文件

在之前我们了解了opengauss的物理机构和逻辑结构,如下:http://www.cndba.cn/dave/article/116486

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后缀命名。http://www.cndba.cn/dave/article/116486

比如我们上面表的文件节点(relfillenode)是16403,那么FSM被存储在一个名为16403_fsm的文件中,该文件与主关系文件在同一个目录中。FSM 文件使用的是树形结构来记录空闲的页块,也是从左到右的查找。http://www.cndba.cn/dave/article/116486http://www.cndba.cn/dave/article/116486

这里要注意并不是在建表时就创建 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后缀来命名。http://www.cndba.cn/dave/article/116486http://www.cndba.cn/dave/article/116486

比如我们之前查询的文件节点为15044,其VM被存储在名为15044_vm的文件中,该文件域主关系文件在同一个目录中。http://www.cndba.cn/dave/article/116486http://www.cndba.cn/dave/article/116486

注意索引没有VM。

VM文件中为每个数据块设置了一个标志位,用来标记数据块中是否存在需要清理的行。有了这个文件后,通过VACUUM命令扫描这个文件时,如果发现VM文件中这个数据块上的位表示该数据块没有需要清理的行,则会跳过对这个数据块的扫描,从而加快VACUUM清理的速度。http://www.cndba.cn/dave/article/116486

通俗一点理解就是在update, delete行后,这些行tuple 并不会马上被清理掉,而是要通过vacuum ,autovacuum 等操作将这些dead tuple 来清理, vm文件的主要作用是显示占用的tuple ,扫描的时候会跳过这些tuple。http://www.cndba.cn/dave/article/116486

PostgreSQL Vacuum 说明
https://www.cndba.cn/dave/article/116401

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2241
    原创
  • 3
    翻译
  • 550
    转载
  • 187
    评论
  • 访问:6768643次
  • 积分:4258
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ