PostgreSQL 的扩展pg_freespacemap

news2025/6/9 17:58:45

PostgreSQL 的扩展pg_freespacemap

pg_freespacemap 是 PostgreSQL 提供的一个内置扩展,用于查看表的空闲空间映射(Free Space Map, FSM)信息。这个扩展对于数据库性能调优和空间管理非常有用。

一 扩展概述

功能:提供对表的空闲空间映射的直接访问
用途

  • 分析表的空间利用率
  • 识别空间浪费严重的表
  • 优化VACUUM和空间回收策略
  • 诊断膨胀问题

版本支持:PostgreSQL 8.4+(不同版本功能可能略有差异)

二、安装与启用

-- 创建扩展
CREATE EXTENSION pg_freespacemap;

-- 验证是否安装成功
SELECT * FROM pg_available_extensions WHERE name = 'pg_freespacemap';

输出示例:

white=# CREATE EXTENSION pg_freespacemap;
CREATE EXTENSION
white=# SELECT * FROM pg_available_extensions WHERE name = 'pg_freespacemap';
      name       | default_version | installed_version |             comment              
-----------------+-----------------+-------------------+----------------------------------
 pg_freespacemap | 1.2             | 1.2               | examine the free space map (FSM)
(1 row)

white=# 

三 主要功能函数

3.1 pg_freespace(relation regclass, blkno bigint)

返回特定表块的空闲空间字节数

-- 获取表'yewu1.t1'的第0块的空闲空间
SELECT pg_freespace('yewu1.t1'::regclass, 0);

输出示例:

white=# SELECT pg_freespace('yewu1.t1'::regclass, 0);
 pg_freespace 
--------------
            0
(1 row)

white=# 

3.2 pg_freespace(relation regclass)

返回表所有块的空闲空间信息

-- 获取表'test'的所有块空闲空间
SELECT * FROM pg_freespace('yewu1.t1'::regclass);

输出示例:

white=# SELECT * FROM pg_freespace('yewu1.t1'::regclass);
 blkno | avail 
-------+-------
     0 |     0
(1 row)

white=#

四 使用示例

示例1:分析表的空间利用率

-- 创建测试表
CREATE TABLE test_table (id serial, data text);
INSERT INTO test_table (data) SELECT generate_series(1,10000)::text;

-- 查看空闲空间分布
SELECT blkno, avail 
FROM pg_freespace('test_table'::regclass)
ORDER BY avail DESC
LIMIT 10;

输出示例:

white=# CREATE TABLE yewu1.test_table (id serial, data text);
CREATE TABLE
white=# INSERT INTO yewu1.test_table (data) SELECT generate_series(1,10000)::text;
INSERT 0 10000
white=# 
white=# -- 查看空闲空间分布
white=# SELECT blkno, avail 
white-# FROM pg_freespace('yewu1.test_table'::regclass)
white-# ORDER BY avail DESC
white-# LIMIT 10;
 blkno | avail 
-------+-------
     4 |    32
     2 |     0
     7 |     0
     9 |     0
     5 |     0
     6 |     0
     3 |     0
     8 |     0
     1 |     0
     0 |     0
(10 rows)

white=# 

示例2:识别空间浪费严重的表

-- 找出数据库中平均空闲空间最多的表
SELECT
    n.nspname AS schema,
    c.relname AS table,
    pg_size_pretty(pg_relation_size(c.oid)) AS size,
    (SELECT avg(avail) FROM pg_freespace(c.oid)) AS avg_free_space
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r'
ORDER BY avg_free_space DESC
LIMIT 10;

输出示例:

white=# SELECT
white-#     n.nspname AS schema,
white-#     c.relname AS table,
white-#     pg_size_pretty(pg_relation_size(c.oid)) AS size,
white-#     (SELECT avg(avail) FROM pg_freespace(c.oid)) AS avg_free_space
white-# FROM pg_class c
white-# JOIN pg_namespace n ON n.oid = c.relnamespace
white-# WHERE c.relkind = 'r'
white-# ORDER BY avg_free_space DESC
white-# LIMIT 10;
   schema   |         table         |  size   | avg_free_space 
------------+-----------------------+---------+----------------
 pg_catalog | pg_user_mapping       | 0 bytes |               
 pg_catalog | pg_subscription       | 0 bytes |               
 pg_catalog | pg_statistic_ext_data | 0 bytes |               
 yewu1      | test5                 | 0 bytes |               
 pg_catalog | pg_foreign_table      | 0 bytes |               
 yewu1      | test6                 | 0 bytes |               
 yewu1      | test2                 | 0 bytes |               
 yewu1      | test4                 | 0 bytes |               
 yewu1      | test3                 | 0 bytes |               
 pg_catalog | pg_inherits           | 0 bytes |               
(10 rows)

white=# 

五 输出解释

pg_freespace 函数输出

列名类型描述
blknobigint块号(从0开始)
availint该块中可用空间字节数

六 实际应用场景

场景1:定期空间监控

-- 创建监控视图
CREATE VIEW table_space_monitor AS
SELECT
    n.nspname AS schema,
    c.relname AS table,
    pg_size_pretty(pg_relation_size(c.oid)) AS size,
    (SELECT avg(avail) FROM pg_freespace(c.oid)) AS avg_free_bytes,
    round((SELECT sum(avail) FROM pg_freespace(c.oid)) * 100.0 / 
          NULLIF(pg_relation_size(c.oid), 0), 2) AS free_percent
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r'
AND pg_relation_size(c.oid) > 0;

输出示例:

white=# CREATE VIEW table_space_monitor AS
white-# SELECT
white-#     n.nspname AS schema,
white-#     c.relname AS table,
white-#     pg_size_pretty(pg_relation_size(c.oid)) AS size,
white-#     (SELECT avg(avail) FROM pg_freespace(c.oid)) AS avg_free_bytes,
white-#     round((SELECT sum(avail) FROM pg_freespace(c.oid)) * 100.0 / 
white(#           NULLIF(pg_relation_size(c.oid), 0), 2) AS free_percent
white-# FROM pg_class c
white-# JOIN pg_namespace n ON n.oid = c.relnamespace
white-# WHERE c.relkind = 'r'
white-# AND pg_relation_size(c.oid) > 0;
CREATE VIEW
white=# 
white=# select * from table_space_monitor;
       schema       |          table          |    size    |     avg_free_bytes     | free_percent 
--------------------+-------------------------+------------+------------------------+--------------
 public             | pgbench_accounts        | 128 MB     |   107.0799220272904483 |         1.31
 public             | pgbench_branches        | 8192 bytes | 0.00000000000000000000 |         0.00
 public             | pgbench_history         | 13 MB      |     4.3969465648854962 |         0.05
 public             | pgbench_tellers         | 8192 bytes | 0.00000000000000000000 |         0.00
 pg_catalog         | pg_type                 | 128 kB     |    54.0000000000000000 |         0.66
 pg_catalog         | pg_statistic            | 208 kB     |    17.2307692307692308 |         0.21
 pg_catalog         | pg_authid               | 8192 bytes |  5984.0000000000000000 |        73.05
 yewu1              | t2                      | 440 kB     |   140.2181818181818182 |         1.71
 yewu1              | test10                  | 8192 bytes | 0.00000000000000000000 |         0.00
 pg_catalog         | pg_attribute            | 568 kB     |     1.3521126760563380 |         0.02
 pg_catalog         | pg_proc                 | 832 kB     |    74.1538461538461538 |         0.91
 pg_catalog         | pg_attrdef              | 8192 bytes | 0.00000000000000000000 |         0.00
 yewu1              | t1                      | 8192 bytes | 0.00000000000000000000 |         0.00
 pg_catalog         | pg_constraint           | 24 kB      |  1546.6666666666666667 |        18.88
 pg_catalog         | pg_index                | 40 kB      |    32.0000000000000000 |         0.39
 pg_catalog         | pg_operator             | 112 kB     |   162.2857142857142857 |         1.98
 pg_catalog         | pg_opfamily             | 16 kB      |   272.0000000000000000 |         3.32
 pg_catalog         | pg_opclass              | 24 kB      |   842.6666666666666667 |        10.29
 pg_catalog         | pg_am                   | 8192 bytes |  7392.0000000000000000 |        90.23
 pg_catalog         | pg_amop                 | 56 kB      |    59.4285714285714286 |         0.73
 pg_catalog         | pg_amproc               | 40 kB      |   921.6000000000000000 |        11.25
 pg_catalog         | pg_language             | 8192 bytes |  7648.0000000000000000 |        93.36
 pg_catalog         | pg_aggregate            | 16 kB      |   128.0000000000000000 |         1.56
 pg_catalog         | pg_rewrite              | 120 kB     |   157.8666666666666667 |         1.93
 pg_catalog         | pg_trigger              | 8192 bytes | 0.00000000000000000000 |         0.00
 pg_catalog         | pg_description          | 344 kB     |    97.4883720930232558 |         1.19
 pg_catalog         | pg_cast                 | 16 kB      |  2208.0000000000000000 |        26.95
 pg_catalog         | pg_namespace            | 8192 bytes |  7584.0000000000000000 |        92.58
 pg_catalog         | pg_conversion           | 16 kB      |   224.0000000000000000 |         2.73
 pg_catalog         | pg_depend               | 128 kB     | 0.00000000000000000000 |         0.00
 pg_catalog         | pg_database             | 8192 bytes |  7008.0000000000000000 |        85.55
 pg_catalog         | pg_tablespace           | 8192 bytes |  7936.0000000000000000 |        96.88
 pg_catalog         | pg_auth_members         | 8192 bytes |  8000.0000000000000000 |        97.66
 pg_catalog         | pg_shdescription        | 8192 bytes |  7936.0000000000000000 |        96.88
 pg_catalog         | pg_ts_config            | 8192 bytes |  5024.0000000000000000 |        61.33
 pg_catalog         | pg_ts_config_map        | 24 kB      |    64.0000000000000000 |         0.78
 pg_catalog         | pg_ts_dict              | 8192 bytes |  4000.0000000000000000 |        48.83
 pg_catalog         | pg_ts_parser            | 8192 bytes |  8032.0000000000000000 |        98.05
 pg_catalog         | pg_ts_template          | 8192 bytes |  7616.0000000000000000 |        92.97
 pg_catalog         | pg_extension            | 8192 bytes |  8032.0000000000000000 |        98.05
 pg_catalog         | pg_init_privs           | 32 kB      |    16.0000000000000000 |         0.20
 pg_catalog         | pg_collation            | 224 kB     |   265.1428571428571429 |         3.24
 pg_catalog         | pg_range                | 8192 bytes |  7776.0000000000000000 |        94.92
 pg_catalog         | pg_sequence             | 8192 bytes | 0.00000000000000000000 |         0.00
 information_schema | sql_features            | 64 kB      |   704.0000000000000000 |         8.59
 information_schema | sql_implementation_info | 8192 bytes |  7296.0000000000000000 |        89.06
 information_schema | sql_parts               | 8192 bytes |  7328.0000000000000000 |        89.45
 information_schema | sql_sizing              | 8192 bytes |  6176.0000000000000000 |        75.39

场景2:自动VACUUM决策

-- 找出需要VACUUM的表(空闲空间超过30%)
SELECT 
    n.nspname AS schema,
    c.relname AS table,
    round((SELECT sum(avail) FROM pg_freespace(c.oid)) * 100.0 / 
          NULLIF(pg_relation_size(c.oid), 0), 2) AS free_percent
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r'
AND (SELECT sum(avail) FROM pg_freespace(c.oid)) > 
    0.3 * pg_relation_size(c.oid)
ORDER BY free_percent DESC;

输出示例:

white=# SELECT 
white-#     n.nspname AS schema,
white-#     c.relname AS table,
white-#     round((SELECT sum(avail) FROM pg_freespace(c.oid)) * 100.0 / 
white(#           NULLIF(pg_relation_size(c.oid), 0), 2) AS free_percent
white-# FROM pg_class c
white-# JOIN pg_namespace n ON n.oid = c.relnamespace
white-# WHERE c.relkind = 'r'
white-# AND (SELECT sum(avail) FROM pg_freespace(c.oid)) > 
white-#     0.3 * pg_relation_size(c.oid)
white-# ORDER BY free_percent DESC;
       schema       |          table          | free_percent 
--------------------+-------------------------+--------------
 pg_catalog         | pg_ts_parser            |        98.05
 pg_catalog         | pg_extension            |        98.05
 pg_catalog         | pg_auth_members         |        97.66
 pg_catalog         | pg_shdescription        |        96.88
 pg_catalog         | pg_tablespace           |        96.88
 pg_catalog         | pg_range                |        94.92
 pg_catalog         | pg_language             |        93.36
 pg_catalog         | pg_ts_template          |        92.97
 pg_catalog         | pg_namespace            |        92.58
 pg_catalog         | pg_am                   |        90.23
 information_schema | sql_parts               |        89.45
 information_schema | sql_implementation_info |        89.06
 pg_catalog         | pg_database             |        85.55
 information_schema | sql_sizing              |        75.39
 pg_catalog         | pg_authid               |        73.05
 pg_catalog         | pg_ts_config            |        61.33
 pg_catalog         | pg_ts_dict              |        48.83
(17 rows)

white=# 

七 注意事项

  1. 性能影响:频繁查询FSM会对系统性能产生一定影响,建议在非高峰期使用
  2. 权限要求:需要超级用户或表所有者权限
  3. 实时性:FSM信息不是实时更新的,VACUUM操作后会更新
  4. 外部表:不适用于外部表
  5. TOAST表:需要单独检查TOAST表的空闲空间

八 与VACUUM的关系

  1. VACUUM会更新FSM信息
  2. FSM大小由参数max_fsm_pagesmax_fsm_relations控制
  3. 可以使用VACUUM VERBOSE查看FSM更新情况
-- 调整FSM参数(需要重启)
ALTER SYSTEM SET max_fsm_pages = 200000;
ALTER SYSTEM SET max_fsm_relations = 10000;

九 故障排查

问题1:扩展无法创建

解决方案

-- 检查是否在正确数据库创建
SELECT current_database();

-- 检查扩展是否已存在
SELECT * FROM pg_available_extensions WHERE name = 'pg_freespacemap';

-- 以超级用户身份创建
\c - postgres
CREATE EXTENSION pg_freespacemap;

问题2:查询返回空结果

可能原因

  • 表太小(小于1个块)
  • 没有空闲空间
  • 权限不足

验证方法

-- 检查表大小
SELECT pg_size_pretty(pg_relation_size('table_name'));

-- 检查权限
\z table_name

通过合理使用pg_freespacemap扩展,数据库管理员可以有效监控和管理PostgreSQL表的空间使用情况,优化存储效率并减少不必要的空间浪费。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2405664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】进程的基本概念

目录 概念描述进程-PCB如何查看进程通过系统目录进行查看通过ps指令进行查看 通过系统调用获取进程的PID和PPID(进程标⽰符)通过系统调用创建子进程通过一段代码来介绍fork为什么要有子进程?fork为什么给子进程返回0,给父进程返回子进程的PIDfork函数到底…

设备驱动与文件系统:05 文件使用磁盘的实现

从文件使用磁盘的实现逻辑分享 我们现在讲第30讲,内容是文件使用磁盘的具体实现,也就是相关代码是如何编写的。上一节我们探讨了如何从字符流位置算出盘块号,这是文件操作磁盘的核心。而这节课,我们将深入研究实现这一核心功能的…

AI数据分析在体育中的应用:技术与实践

在现代体育竞技领域,"数据驱动"已不再是一个遥远的概念。尤其随着人工智能(AI)和大数据分析的不断成熟,从职业俱乐部到赛事直播平台,从运动员训练到球迷观赛体验,AI正以前所未有的方式渗透并改变…

zabbix 6 监控 docker 容器

zabbix 6 监控 docker 容器 1.安装zabbix_agent2 curl -s http://10.26.211.56:8080/centos7-agent2-install.sh | bash2.在zabbix server 端测试 zabbix_get -s 10.26.219.180 -k docker.infoZBX_NOTSUPPORTED: Cannot fetch data: Get "http://1.28/info": dial…

正则持续学习呀

源匹配为 (.*): (.*)$ 替换匹配为 "$1": "$2", 可将headers改为字典 参考 【爬虫军火库】如何优雅地复制请求头 - 知乎

Go基本语法——go语言中的四种变量定义方法

前言 在go语言中,定义一个变量有四种方式,本文单从语法的层面来介绍这几种方式 单变量定义方法 1.var 变量名 类型,不进行初始化 例如,定义一个变量a后为其赋值,并且打印其值,运行结果如下 //1.不进行…

27.【新型数据架构】-数据共享架构

27.【新型数据架构】-数据共享架构:降低数据获取成本,实时数据访问,保持数据新鲜度,促进数据经济发展,打破数据孤岛,标准化数据交换,增强数据安全性,完整审计追踪,合规性保障 一、数据共享架构的本质:打破壁垒的“数字立交桥” 传统企业或组织间的数据往往呈现“烟囱…

virtualbox 如何虚拟机ip固定

1、在网络管理里新建 2、配置网络 3、 进入linux系统,查看 查看 网卡是enp0s8, ifconfig 4、进入网卡配置文件 cd /etc/sysconfig/network-scripts如果没有enp0s8 ,则使用mv ifcfg-enp0s3 ifcfg-enp0s8命令 配置项如下 TYPEEthernet PROXY_METHODn…

RKNN3588上部署 RTDETRV2

RT-DETR V2 是由百度研究团队在 2024年 提出的,是其广受好评的实时目标检测模型 RT-DETR 的重大升级版本。它继承了第一代 RT-DETR 利用 Transformer 架构实现端到端目标检测 和 卓越实时性能 的核心优势,并针对模型精度、训练效率和部署灵活性进行了全方…

Python----循环神经网络(BiLSTM:双向长短时记忆网络)

一、LSTM 与 BiLSTM对比 1.1、LSTM LSTM(长短期记忆网络) 是一种改进的循环神经网络(RNN),专门解决传统RNN难以学习长期依赖的问题。它通过遗忘门、输入门和输出门来控制信息的流动,保留重要信息并丢弃无关…

Linux系统编程-DAY10(TCP操作)

一、网络模型 1、服务器/客户端模型 (1)C/S:client server (2)B/S:browser server (3)P2P:peer to peer 2、C/S与B/S区别 (1)客户端不同&#…

基于eclipse进行Birt报表开发

Birt报表开发最终实现效果: 简洁版的Birt报表开发实现效果,仅供参考! 可动态获取采购单ID,来打印出报表! 下面开始Birt报表开发教程: 首先:汉化的eclipse及Birt值得拥有:至少感觉上…

GPU虚拟化

引言 现有如下环境(注意相关配置:只有一个k8s节点,且该节点上只有一张GPU卡): // k8s版本 $ kubectl version Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.7&…

LabVIEW工业级多任务实时测控系统

采用LabVIEW构建了一套适用于工业自动化领域的多任务实时测控系统。系统采用分布式架构,集成高精度数据采集、实时控制、网络通信及远程监控等功能,通过硬件与软件的深度协同,实现对工业现场多类型信号的精准测控,展现 LabVIEW 在…

破解HTTP无状态:基于Java的Session与Cookie协同工作指南

HTTP协议自身是属于“无状态”协议 无状态是指:默认情况下,HTTP协议的客户端和服务器之间的这次通信,和下次通信之间没有直接的关系 但在实际开发中,我们很多时候是需要知道请求之间的关联关系的 上述图中的令牌,通常就…

JS 事件流机制详解:冒泡、捕获与完整事件流

JS 事件流机制详解:冒泡、捕获与完整事件流 文章目录 JS 事件流机制详解:冒泡、捕获与完整事件流一、DOM 事件流基本概念二、事件捕获 (Event Capturing)特点代码示例 三、事件冒泡 (Event Bubbling)特点代码示例 四、完整事件流示例HTML 结构JavaScript…

算法专题七:分治

快排 1.颜色分类 题目链接:75. 颜色分类 - 力扣(LeetCode) class Solution {public void swap(int[] nums, int i, int j){int t = nums[i];nums[i] = nums[j];nums[j] = t;}public void sortColors(int[] nums) {int left=-1 ,i=0 ,right=nums.length;while(i<right){i…

Vue中虚拟DOM的原理与作用

绪论 首先我们先了解&#xff0c;DOM&#xff08;Document Object Model&#xff0c;文档对象模型&#xff09; 是浏览器对 HTML/XML 文档的结构化表示&#xff0c;它将文档解析为一个由节点&#xff08;Node&#xff09;和对象组成的树形结构&#xff08;称为 DOM 树&#xf…

使用vue3+ts+input封装上传组件,上传文件显示文件图标

效果图&#xff1a; 代码 <template><div class"custom-file-upload"><div class"upload"><!-- 显示已选择的文件 --><div class"file-list"><div v-for"(item, index) in state.filsList" :key&q…

【Linux】Ubuntu 创建应用图标的方式汇总,deb/appimage/通用方法

Ubuntu 创建应用图标的方式汇总&#xff0c;deb/appimage/通用方法 对于标准的 Ubuntu&#xff08;使用 GNOME 桌面&#xff09;&#xff0c;desktop 后缀的桌面图标文件主要保存在以下三个路径&#xff1a; 当前用户的桌面目录&#xff08;这是最常见的位置&#xff09;。所…