You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询PostgreSQL中表占用的实际物理磁盘大小

查询PostgreSQL表物理磁盘占用的方法

内置函数直接查询(推荐,实时准确)

PostgreSQL自带的函数可以直接读取文件系统层面的实际占用大小,返回结果和操作系统层面统计的文件大小完全一致,不会扣除数据库内部标记为可复用的空闲空间,完全匹配你要的磁盘物理大小需求:

  • pg_relation_size(regclass, 'main'):返回单张表主数据分支的物理字节数,不包含索引、TOAST表、附属映射文件的大小
  • pg_total_relation_size(regclass):返回表关联所有对象的总物理字节数,包含主表、所有索引、TOAST表、空闲空间映射、可见性映射的全部文件大小
  • 搭配pg_size_pretty()可以直接输出易读的单位格式,示例查询:
-- 替换为你的实际表名,支持带schema的写法,比如public.user_behavior
SELECT
  pg_size_pretty(pg_relation_size('你的表名'::regclass, 'main')) AS 主表物理大小,
  pg_size_pretty(pg_total_relation_size('你的表名'::regclass)) AS 表及关联对象总物理大小;

注意不要用pg_class.relpages * current_setting('block_size')::int的方式计算,relpages是上一次执行ANALYZE时记录的快照值,存在统计延迟,不是实时结果。

查询关联存储文件路径(供shell侧统计)

如果需要在操作系统层面统计大小,可以先查询到表对应数据文件的基础路径,再遍历相关文件统计:

  1. 执行以下SQL获取表主数据文件相对于PGDATA(PostgreSQL数据根目录)的相对路径:
SELECT pg_relation_filepath('你的表名'::regclass);
  1. 实际磁盘上的相关文件包含:
  • 基础路径对应的主数据文件,超过1G时会自动切分为基础路径.1、基础路径.2这类分段文件
  • 基础路径加_fsm后缀的空闲空间映射文件
  • 基础路径加_vm后缀的可见性映射文件
  1. 在shell侧可以直接统计所有匹配前缀的文件总大小,示例命令:
# 替换为实际的PGDATA路径和上一步查到的基础路径
du -cb $PGDATA/你查到的相对路径* | tail -n1

关于高频更新热表的补充说明

你对表膨胀的判断符合实际逻辑:对于持续高频更新、无法获取排他锁的热表,普通VACUUM仅能将死元组占用的空间标记为可复用,不会将空间返还给操作系统,物理文件大小会持续增长直到达到稳态——也就是死元组释放的空间刚好可以覆盖后续更新的空间需求,之后文件大小不会无限制上涨。
如果需要在线回收膨胀空间、降低物理磁盘占用,又不想承受VACUUM FULL的长时间锁影响,可以使用无长锁的在线重组工具完成空间回收,不阻塞正常业务读写。


内容的提问来源于stack exchange,提问作者filpa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:48:16