语言
English English Vietnamese (Tiếng Việt) Vietnamese (Tiếng Việt) Chinese (简体中文) Chinese (简体中文) Portuguese (Brazil) (Português do Brasil) Portuguese (Brazil) (Português do Brasil) Spanish (Español) Spanish (Español) Indonesian (Bahasa Indonesia) Indonesian (Bahasa Indonesia)

数据库查出来的表、索引、关系大小都是一串裸字节整数,换成 GB 才是容量规划和扩容单子上写的数字。

把每行的字节数变成能拿去做规划的表容量

数据库回答问题一律用字节。pg_total_relation_size('orders') 返回的是一个裸整数;information_schema.tables 里的 data_lengthindex_length 也是字节;存储引擎的统计页面丢给你的,是一个九位或十二位、连单位都不写的数字。而容量规划这一侧全是吉字节——你要开多大的盘、要把云盘扩到多少、要让谁签字批的那笔预算。

换算系数:GB = 字节 ÷ 1 000 000 000。所以一张报出 42 500 000 000 字节的表,就是 42 500 000 000 ÷ 1 000 000 000 = 42.5 GB

真正有用的本事不是这一步除法,而是搞清楚这个数字里到底包含了哪些字节。关系大小和表大小是两个不同的值,容量预测出岔子,多半就出在这两者的差额上。

行宽从来不只是各列之和

PostgreSQL 每行都要加 23 字节的元组头,页内还有 4 字节的行指针,列宽还会按对齐边界往上取整。你算出来 100 字节的一行,落到盘上更接近 130 字节。

索引往往是更大的那一半

索引建得重的表,索引字节数可以超过堆表本身。这正是关系总大小和单纯的表大小会分道扬镳的原因,有时差出一两倍不止。

增长是速率,不是一张快照

行宽乘以每天新增行数,得到每天的字节数。换成每月多少 GB,就成了那个决定你这季度扩容还是明年再说的数字。

从一个字节数到一份扩容方案

1

从数据库里取出字节数

要那个未经格式化的整数,别要漂亮的字符串——原始值才是你要换算的对象,也免得服务端已经替你四舍五入到一位小数。

2

粘进字节一栏

吉字节数随打随出。查询结果常常已经用空格分好组,或者用逗号当小数点,两种都能处理,空格会被直接忽略。

3

复制进容量方案

每一栏的复制按钮给回的都是纯数字,可以直接落进表格单元格、Terraform 里的云盘大小或一条工单,不用先手工去掉单位。

4

反过来写监控阈值

监控规则或配额要用数据库自己暴露的单位时,把两栏交换一下,从吉字节回到字节。任一下拉菜单都支持搜索,表长到 GB 装不下时,太字节一敲就有。

行宽 × 行数:一张表究竟要吃多少空间

把落盘后的平均行宽乘以行数,得到堆表字节数;再除以十亿就是吉字节。下表假定行宽已经把每行的头部算进去了,且不含索引——索引要另外加。

典型表 行宽 行数 堆表字节数 折合 GB
窄表事件流96 B250 000 00024 000 000 00024 GB
会话记录128 B10 000 0001 280 000 0001.28 GB
订单明细256 B50 000 00012 800 000 00012.8 GB
用户资料512 B100 000 00051 200 000 00051.2 GB
带 JSON 的审计日志1 024 B5 000 0005 120 000 0005.12 GB
宽行文档表2 048 B1 000 0002 048 000 0002.048 GB

还有两项修正几乎总要考虑。等待清理的死元组会让堆表比算出来的更大;任何取值超过大约两千字节的列会被压缩并挪到行外存储关系里,单纯的表大小不含它,而关系总大小含。

比对多张表时两栏都是活的

在任意一栏输入,另一栏立刻跟上,于是一条查询列出来的一串关系大小可以一口气看完,不用每次先清空再重输。

十二位数也读得清

千位之间用空格分隔,结果特别大时切到科学计数法,裸字节数少数一位多数一位,一眼就能看出来。

表涨过 TB 也跟得上

两个单位菜单都支持搜索、且列出全部存储单位,所以同一个页面既能算千字节级的小字典表,也能算太字节级的分区事实表。

生产数据留在本地

页面加载完之后一切都在浏览器里算完,从生产库里抄出来的大小不会被发去任何地方。

数据库容量相关问题

为什么表比各列宽度加起来还大?

数据还没开始存,每行就先背了一笔固定开销。在 PostgreSQL 里是 23 字节的元组头,加上页内 4 字节的行指针,列值还要按各自的对齐边界补齐——bool 后面跟一个 bigint,可能白白浪费七个字节。窄表上这些加起来能占到一行的三分之一。所以要用真实行宽、而不是名义行宽,去换算吉字节。

规划容量时要不要把索引算进去?

要,而且经常被低估。每个索引都要存自己的键列、一个行指针和自己的页开销,所以一张带六个索引的表,花在索引上的空间可能超过堆表。堆表和索引分别估、分别换成吉字节、再按总和去开容量——然后还得给重建索引时那份临时副本留出余量。

关系总大小到底包含了些什么?

它返回的字节数涵盖堆表、全部索引、空闲空间映射和可见性映射,以及挂在这张表上的行外存储关系。而单纯的表大小函数只管堆表和它的映射文件。监控面板和手工查询对同一张表报出不同数字时,原因几乎总是这个——一边把索引算了,另一边没算。

超大的列值会怎样打乱这套算法?

一行必须塞进一个页里,所以某个值一旦涨过大约两千字节,引擎会先压缩它;还不够就把它移出行外、放进一个附属关系,行里只留一个小指针。于是看得见的行宽塌了下去,真正的存储却在别处。对于装大段文本或 JSON 文档的表,不去量那个附属关系,行宽乘行数的估算可能低得离谱。

怎么用每天的新增行数推算明年的容量?

用每天新增行数乘以实测的落盘行宽,得到每天多少字节,换成吉字节,再乘以保留周期。每天 2 000 000 行、行宽 256 字节,就是每天新增 512 000 000 字节——0.512 GB,一个月约 15.4 GB。再按你在现有数据上实测的索引占比往上加,然后过一个月拿实际增长回头校对,别只信第一次估算。

B
GB

常见关系大小(字节)

250 000 000 B=0.25 GB
1 073 741 824 B=1.073741824 GB
5 000 000 000 B=5 GB
42 500 000 000 B=42.5 GB
120 000 000 000 B=120 GB
1 250 000 000 000 B=1 250 GB

字节(B)

所有大小函数报数用的单位:堆页、索引页、行外存储关系,以及每行 23 字节的元组头,返回的都是一个不带单位的字节整数。

吉字节(GB)

十亿字节,也是容量方案里争来争去的单位——你要开的云盘、你要预测的月增量、账单上那一行存储费用。

换算查询返回的裸整数,别用已经四舍五入过的格式化字符串
堆表和索引分开算——索引建得多的表,索引占的空间可能比数据行还大
监控阈值或配额要用数据库自己的单位写时,用交换单位换回字节
两个单位菜单都支持搜索,分区表大到 GB 装不下时可以在同一页改成 TB
想了解更多? 阅读文档 →
1/5
开始输入以搜索...
搜索中...
未找到结果
请尝试使用不同的关键词搜索