暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

postgresql中vm与fsm文件

原创 _ 2025-02-02
106

1. 空闲空间映射(FSM)文件

  • 作用:
    • fsm 文件用于记录表或索引中每个数据块的空闲空间情况。
    • 当插入新行时,PostgreSQL 会查询 fsm 文件以确定哪些数据块有空闲空间可以存放新行。
    • 如果某个数据块已满,其块 ID 会从 fsm 中移除。
  • 结构:
  • fsm 文件记录了每个数据块的空闲空间信息,包括最大空闲页面数(max_fsm_pages)和最大空闲关系数(max_fsm_relations)。
  • fsm 文件在表或索引第一次进行 VACUUM 操作时创建。

2. 可见性映射(VM)文件

  • 作用:
    • vm 文件用于跟踪哪些数据块只包含对所有活动事务可见的元组。
    • 在 VACUUM 操作中,vm 文件帮助 PostgreSQL 快速确定哪些数据块需要清理。
    • vm 文件为每个数据块设置了一个标志位,标记数据块中是否存在需要清理的行。
  • 结构:
  • vm 文件记录了每个数据块的可见性信息,包括是否包含已知对所有活动事务可见的元组。
  • vm 文件在表第一次进行 VACUUM 操作时创建。

3. 文件命名和存储位置

  • 命名:
    • fsm 文件的命名格式为 <relfilenode>_fsm,例如 12345_fsm。
    • vm 文件的命名格式为 <relfilenode>_vm,例如 12345_vm。
  • 存储位置:
  • fsm 和 vm 文件与主数据文件存储在同一个目录中。

4. 使用场景

  • fsm 文件:
    • 在插入新行时,PostgreSQL 会查询 fsm 文件以找到有空闲空间的数据块。
    • fsm 文件帮助管理表的空闲空间,提高插入操作的效率。
  • vm 文件:
  • 在 VACUUM 操作中,vm 文件帮助 PostgreSQL 快速确定哪些数据块需要清理。
  • vm 文件通过标志位标记数据块中是否存在需要清理的行,从而提高 VACUUM 操作的效率。

5. 示例

假设有一个表 film,其 relfilenode 为 12345,则:

  • fsm 文件名为 12345_fsm,用于记录空闲空间信息。
  • vm 文件名为 12345_vm,用于记录可见性信息。

6. 注意事项

  • 创建时机:
    • fsm 和 vm 文件并不是在表创建时立即生成的,而是在第一次进行 VACUUM 操作时创建。
  • 文件大小:
  • 当数据文件或索引文件超过某个容量(如默认 1GB)时,会生成分片文件,例如 12345.1、12345.2 等。

7. pg_freespace 和 pg_visibility 函数

PostgreSQL 提供了 pg_freespace 和 pg_visibility 函数,可以用来查看 fsm 和 vm 文件中的信息。

查看 fsm 文件信息

postgres=# create extension pg_freespacemap;

CREATE EXTENSION

postgres=# SELECT * FROM pg_freespace('t1');

blkno | avail

-------+-------

0 | 0

1 | 0

2 | 0

3 | 0

4 | 0

5 | 0

6 | 0

7 | 0

8 | 0

9 | 0

10 | 0

11 | 0

12 | 0

13 | 0

14 | 0

15 | 0

(16 rows)

postgres=# vacuum t1;

VACUUM

postgres=# SELECT * FROM pg_freespace('t1');

blkno | avail

-------+-------

0 | 32

1 | 160

2 | 128

3 | 0

4 | 96

5 | 128

6 | 0

7 | 0

8 | 64

9 | 96

10 | 2400

(11 rows)

postgres=# SELECT * FROM pg_freespace('t1',8);

pg_freespace

--------------

64

(1 row)


查看 vm 文件信息

postgres=# create extension pg_visibility;

CREATE EXTENSION

postgres=# SELECT * FROM pg_visibility_map('t1');

blkno | all_visible | all_frozen

-------+-------------+------------

0 | f | f

1 | f | f

2 | f | f

3 | f | f

4 | f | f

5 | f | f

6 | f | f

7 | f | f

8 | f | f

9 | f | f

10 | f | f

11 | f | f

12 | f | f

13 | f | f

14 | f | f

15 | f | f

(16 rows)

postgres=# vacuum t1;

VACUUM

postgres=# SELECT * FROM pg_visibility_map('t1');

blkno | all_visible | all_frozen

-------+-------------+------------

0 | t | f

1 | t | f

2 | t | f

3 | t | f

4 | t | f

5 | t | f

6 | t | f

7 | t | f

8 | t | f

9 | t | f

10 | t | f

(11 rows)



postgres=# select * from heap_page_items(get_raw_page('t1',5)) where t_data is not null limit 3;

lp | lp_off | lp_flags | lp_len | t_xmin | t_xmax | t_field3 | t_ctid | t_infomask2 | t_infomask | t_hoff | t_bits | t_oid |

t_data

----+--------+----------+--------+--------+--------+----------+--------+-------------+------------+--------+--------------------------+-------+------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------

1 | 8048 | 1 | 141 | 752 | 0 | 5 | (5,1) | 17 | 2307 | 32 | 110110111000110010000000 | | \x1f6c6f675f6c6f636b5f7761697473096f6666495265706f7274696e6720616e64204c6f6767696e67202f2

05768617420746f204c6f672d4c6f6773206c6f6e67206c6f636b2077616974732e157375706572757365720b626f6f6c1164656661756c74096f6666096f666600

2 | 7696 | 1 | 348 | 752 | 0 | 5 | (5,2) | 17 | 2307 | 32 | 111111111110110010000000 | | \x316c6f675f6d696e5f6475726174696f6e5f73616d706c65072d31076d73495265706f7274696e6720616e6

4204c6f6767696e67202f205768656e20746f204c6f6700002c0200005365747320746865206d696e696d756d20657865637574696f6e2074696d652061626f766520776869636820612073616d706c65206f662073746174656d656e74732077696c6c206265206c6f676765642e2053616d706c

696e672069732064657465726d696e6564206279206c6f675f73746174656d656e745f73616d706c655f726174652e7d5a65726f206c6f677320612073616d706c65206f6620616c6c20717565726965732e202d31207475726e7320746869732066656174757265206f66662e157375706572757

3657211696e74656765721164656661756c74072d311732313437343833363437072d31072d3100

3 | 7416 | 1 | 275 | 752 | 0 | 5 | (5,3) | 17 | 2307 | 32 | 111111111110110010000000 | | \x376c6f675f6d696e5f6475726174696f6e5f73746174656d656e74072d31076d73495265706f7274696e672

0616e64204c6f6767696e67202f205768656e20746f204c6f67975365747320746865206d696e696d756d20657865637574696f6e2074696d652061626f766520776869636820616c6c2073746174656d656e74732077696c6c206265206c6f676765642e695a65726f207072696e747320616c6c

20717565726965732e202d31207475726e7320746869732066656174757265206f66662e1573757065727573657211696e74656765721164656661756c74072d311732313437343833363437072d31072d3100

(3 rows)


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论