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)