FSM(空闲空间映射)是PostgreSQL用于跟踪表和索引页面空闲空间的核心机制,通过近似记录每个页面的可用空间并以树形结构组织,使插入操作能快速定位可重用页面,减少盲目扫描和频繁扩展文件,提升写入效率与存储利用率;其信息由VACUUM更新,受fillfactor和autovacuum策略影响,合理配置可避免表膨胀和插入性能下降。

PostgreSQL中的FSM(Free Space Map,空闲空间映射)是用于跟踪表和索引中页面可用存储空间的核心机制。它的主要作用是帮助数据库快速找到有足够空闲空间的页面,以便插入新数据,避免频繁申请新页,提升存储利用率和写入效率。
FSM的作用与必要性
在PostgreSQL中,当行被更新或删除时,原空间不会立即归还操作系统,而是标记为可重用。如果没有机制记录哪些页面还有多少空闲空间,每次插入都需要扫描大量页面才能找到合适位置,严重影响性能。
FSM正是为解决这个问题而存在。它保存每个页面的大致空闲空间信息,使得插入操作能快速定位到仍有足够空间的页面,减少盲目扫描。
关键点:
- FSM不记录精确空闲字节数,而是以近似值方式存储(通过一个字节表示0-255之间的等级)
- 每个堆表或索引对应一个FSM结构,存储在单独的文件中(后缀为_fsm)
- FSM本身也占用磁盘空间,但远小于主表
FSM的内部结构
FSM采用树形结构组织,通常是4层B树变体,根节点位于第一页,叶子节点指向实际的数据页。
层级说明:
- 层级0(叶子层): 每个条目对应一个数据页,用一个字节表示其空闲空间等级(0表示无空闲,255表示几乎全空)
- 中间层: 聚合下一层各块的最大空闲值,便于快速跳过空闲不足的区域
- 根节点: 提供整个关系的整体空闲概览,加速查找起点
这种设计允许系统从根开始向下遍历,只访问最有可能满足插入需求的页面,极大减少I/O开销。
FSM如何参与插入流程
当执行INSERT操作时,PostgreSQL会按以下逻辑使用FSM:
英文企业网站管理系统(英文网站设计系统)采用主流的Asp+Access开发设计,开发新英文模板,漂亮大气。是方便自主管理的英文网站建设系统,程序小巧,速度快,后台一站式管理,代码功能全部开源,无任何限制。支持所有Asp虚拟空间,兼容良好,程序采用Div+Css设计,兼容ie6、ie7、ie8、火狐等英文浏览器,网站优化结构设计,配置网站地图,容易被搜索引擎收录,上关键词排名!欢迎大家使用。程序功能
- 查询该表的FSM结构,寻找空闲空间足以容纳新元组的页面
- 根据FSM指引定位具体页并尝试插入
- 若目标页实际空间不足(因FSM为近似值),则继续查找下一个候选页
- 若未找到合适页,则扩展关系文件,分配新页
同时,VACUUM操作会更新FSM信息,将已清理出的空间重新登记,供后续插入使用。
FSM相关配置与维护
PostgreSQL提供了一些参数控制FSM行为:
- fillfactor: 控制页面最大填充度,默认100。设为90意味着预留10%空间给更新,影响FSM初始空闲值
- vacuum FSM更新: VACUUM会重建FSM内容,确保空闲信息准确
- autovacuum: 定期运行可防止FSM信息陈旧,避免“明明有空闲却不断扩表”问题
可通过如下命令查看FSM状态:
SELECT pg_freespace('your_table', 0); -- 查看第0页的空闲空间(需指定fork为fsm)也可使用pg_visibility等工具分析表的空闲空间分布。
常见问题与优化建议
- FSM文件过大? 通常无需担心,它是稀疏映射,且压缩高效
- 插入仍慢? 可能FSM信息滞后,考虑手动执行VACUUM
- 频繁扩展文件? 检查是否autovacuum不及时,或fillfactor设置不合理
合理配置autovacuum、适当调整fillfactor,并定期监控表膨胀情况,能有效发挥FSM优势。
基本上就这些。FSM虽不显眼,却是PostgreSQL高效管理存储的关键组件之一。理解其原理有助于排查性能问题和优化写密集型应用。不复杂但容易忽略。









