Postgres中numeric(10,2)存储字节数计算及相关疑问
计算PostgreSQL中numeric(10,2)的平均存储开销
针对你提出的关于PostgreSQL numeric(10,2) 存储开销的疑问,结合官方文档规则和实际查询结果,解答如下:
疑问1:2位小数部分的存储需求是否为1字节?
不是。numeric 类型不会单独拆分小数和整数部分计算存储,而是将整个数值的有效数字(包括整数和小数位)统一处理。对于 numeric(10,2) 这类小精度类型,PostgreSQL会做优化:将数值转换为整数乘以10的负小数位次方(比如123.45转为12345×10^-2),若这个整数能被64位存储,就会用短格式存储,数字部分仅占2字节,而非按小数位单独计算。
疑问2:3至8字节的开销如何确定具体值?
文档中的3-8字节开销对应numeric的两种存储格式:
- 短格式(short numeric):对于
numeric(10,2),所有数值对应的整数都远小于64位整数上限,因此绝大多数场景会用短格式。此时开销为4字节的变长类型头部+2字节的元数据,加上数字部分的2字节,总存储大小为6字节(比如0.00、123.45这类常规值)。 - 长格式(long numeric):仅当数值超出64位整数范围时触发,此时开销为3-8字节,加上按每4位十进制占2字节计算的数字部分。但
numeric(10,2)的最大值也远在64位整数范围内,几乎不会用到长格式。
你查询得到的平均6.95字节,是因为极少数特殊数值的存储会额外占用1-2字节,拉低了整体平均值,但绝大多数常规数值的存储大小都是6字节。
提前估算方法
针对不同精度的numeric(p,s)类型:
- 若
(p-s)*10^s的最大值小于64位整数上限(比如numeric(10,2)、numeric(18,4)等),绝大多数数值的存储大小为6字节,平均可按7字节估算; - 对于更大精度的
numeric类型,按文档规则计算:数字部分字节数=向上取整(p/2)(等价于每4位占2字节),加上3-8字节开销,总存储大小范围为ceil(p/2)+3到ceil(p/2)+8字节。
内容的提问来源于stack exchange,提问作者vale383
相关产品推荐
相关产品推荐

