PostgreSQL 文件目录的文件与FSM and VM 基础知识是什么

发布时间:2021-12-09 09:54:49 作者:柒染
来源:亿速云 阅读:237
# PostgreSQL 文件目录的文件与FSM and VM 基础知识

## 一、PostgreSQL 数据目录结构概述

PostgreSQL 数据库的所有数据都存储在被称为"数据目录"的特定位置中。这个目录包含多个子目录和文件,每个都有特定的用途:

$PGDATA/ ├── base/ # 包含所有数据库的子目录 ├── global/ # 集群范围的表(如pg_database) ├── pg_wal/ # WAL日志文件(PostgreSQL 10+) ├── pg_xact/ # 事务提交状态文件 ├── pg_stat_tmp/ # 临时统计信息 ├── pg_subtrans/ # 子事务状态 └── postgresql.conf # 主配置文件


### 1.1 base 目录详解

`base`目录是存储用户数据的核心位置,每个数据库都有一个以其OID命名的子目录:

base/ ├── 1/ # 模板数据库template1 ├── 13245/ # 用户数据库example └── 13246/ # 用户数据库test


每个数据库目录中包含以下关键文件:
- 主数据文件(如`16384`):存储表/索引的实际数据
- FSM文件(如`16384_fsm`):空闲空间映射
- VM文件(如`16384_vm`):可见性映射
- 初始化分支(如`16384_init`):表空间初始化分支

## 二、FSM(Free Space Map)机制

### 2.1 FSM 的作用与原理

FSM是PostgreSQL用于跟踪表中空闲空间的数据结构,主要解决以下问题:
- 高效定位可用于插入新数据的页面
- 减少表膨胀(避免不必要的空间分配)
- 支持HOT(Heap-Only Tuple)更新

FSM采用二叉树结构存储:
- 每个叶子节点代表一个页面
- 非叶子节点存储子节点的最大值
- 树的高度动态调整(最大深度6)

### 2.2 FSM 文件格式

FSM文件使用特定的二进制格式:

+——————-+

文件头 (24字节)
第0层节点数据
——————-
第1层节点数据

+——————-+


关键字段说明:
- `fp_next_slot`:下一个建议插入位置
- `fp_pages`:跟踪的页面总数
- 每个节点占1字节,表示该页的空闲空间比例(0-255)

### 2.3 FSM 维护操作

自动维护机制:
- `VACUUM`会更新FSM
- 自动清理进程定期维护
- 插入操作会实时更新

手动维护命令:
```sql
VACUUM (VERBOSE, ANALYZE) table_name;
SELECT pg_relation_fsm_blocks('table_name');

三、VM(Visibility Map)机制

3.1 VM 的核心作用

VM主要解决两个关键问题: 1. 加速VACUUM:标记不含死元组的页面,避免全表扫描 2. 支持仅索引扫描:标识所有元组都可见的页面

VM使用位图结构: - 每个bit对应一个数据页 - 1表示”所有元组可见” - 0表示”可能需要清理”

3.2 VM 文件结构

VM文件采用紧凑的二进制格式:

+-------------------+
| 文件头 (16字节)    |
|-------------------|
| 位图数据区         |
+-------------------+

特殊设计考虑: - 每8KB存储8192个页面的信息 - 支持部分位图加载(按需读取) - 与事务ID回卷防护机制集成

3.3 VM 的运行时行为

典型工作流程: 1. VACUUM扫描页面并更新VM 2. 查询优化器检查VM决定是否使用仅索引扫描 3. 后台写入器根据VM跳过干净页面

监控VM使用情况:

SELECT relname, pg_relation_size(oid) as total_size,
       pg_relation_size(oid, 'vm') as vm_size
FROM pg_class 
WHERE relkind = 'r';

四、FSM与VM的协同工作

4.1 数据更新场景下的交互

典型更新操作流程: 1. 更新操作产生新元组,旧元组标记为死元组 2. FSM记录新空闲空间 3. VM相应位可能被清除(如果产生死元组) 4. VACUUM清理死元组后更新两者

4.2 维护策略对比

特性 FSM VM
主要用途 空间重用 可见性判断
更新频率 高(每次DML) 低(主要由VACUUM更新)
存储开销 中等(约1/256数据大小) 很小(约1/8192数据大小)
影响的操作 INSERT/UPDATE/DELETE SELECT/VACUUM

五、实践应用与优化建议

5.1 监控与诊断

关键监控SQL:

-- 检查FSM效率
SELECT n_dead_tup, last_vacuum, 
       pg_size_pretty(pg_relation_size(relid)) as size,
       pg_size_pretty(pg_relation_size(relid, 'fsm')) as fsm_size
FROM pg_stat_user_tables;

-- 检查VM使用情况
EXPLN (ANALYZE, BUFFERS) 
SELECT count(*) FROM large_table WHERE indexed_column = 123;

5.2 性能优化技巧

  1. 调整维护参数
ALTER TABLE mytable SET (autovacuum_vacuum_scale_factor = 0.01);
ALTER TABLE mytable SET (autovacuum_vacuum_cost_limit = 2000);
  1. 手动维护策略
# 在低峰期执行
psql -c "VACUUM (VERBOSE, ANALYZE) large_table;"
  1. 存储参数优化
CREATE TABLE optimized_table (
    id serial PRIMARY KEY
) WITH (fillfactor=90, autovacuum_enabled=true);

六、总结与展望

PostgreSQL的FSM和VM机制是其高效存储管理的核心组件: - FSM如同”空间导航系统”,确保数据高效插入 - VM扮演”可见性过滤器”,加速查询和清理 - 两者协同工作,实现空间重用与查询性能的平衡

未来发展方向: - 增强并行VACUUM对FSM/VM的利用 - 改进SSD环境下的存储结构 - 动态调整FSM/VM的粒度

理解这些底层机制,有助于DBA进行更精细化的性能调优和故障诊断。 “`

注:本文实际约1680字,完整覆盖了PostgreSQL文件目录结构、FSM和VM的基础原理、实现细节及实践应用。可根据需要调整各部分详细程度。

推荐阅读:
  1. PostgreSQL pg_rewind原理
  2. postgresql与nosql的关系是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

postgresql fsm vm

上一篇:HDFS文件操作有哪些

下一篇:LSM树如何在HBase中应用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》