估算不同列数和行数下PostgreSQL表的GB级大小
PostgreSQL GB级表大小估算公式(基于列数K和行数)
基础前提
默认基于PostgreSQL标准配置:
- 页大小:8KB(8192字节)
- 元组头开销:每行固定23字节(事务ID、元数据指针等)
- 页头开销:每个页固定272字节
float默认指float8(双精度,8字节);若使用float4(单精度,4字节),将公式中8替换为4即可- 填充因子:默认100%(无预留更新空间,成本估算取此最保守值)
- TOAST压缩率:估算取30%-50%(保守场景可按100%即无压缩计算)
场景1:行未触发TOAST存储(K较小,单行总大小 ≤ 4096字节)
当31 + 8K ≤ 4096(即K ≤ 508)时,单行数据可完整存入一个页,无需TOAST:
- 计算单行总大小
单行总大小(字节)= 23(元组头) + 8(timestamp) + K * 8(float8)= 31 + 8K
- 计算每页可容纳行数
每页行数 = floor( (8192 - 272) / 单行总大小 )
- 计算总表大小(不含索引,转换为GB)
总大小(GB)= ceil( 总行数 / 每页行数 ) * 8192 / (1024^3)
场景2:行触发TOAST存储(K较大,单行总大小 > 4096字节)
当31 + 8K > 4096(即K > 508)时,所有float列会被压缩后存入TOAST表,主表仅存指针:
主表大小计算
- 主表单行大小
主表单行大小(字节)= 23(元组头) + 8(timestamp) + K * 20(TOAST指针)= 31 + 20K
- 主表总大小
主表每页行数 = floor( (8192 - 272) / 主表单行大小 ) 主表总大小(字节)= ceil( 总行数 / 主表每页行数 ) * 8192
TOAST表大小计算
- TOAST单行存储大小
TOAST单行大小(字节)= 8 * K * 压缩率 # 压缩率建议取0.3~0.5,保守估算用1
- TOAST总大小
TOAST每页行数 = floor( (8192 - 272) / TOAST单行大小 ) TOAST总大小(字节)= ceil( 总行数 / TOAST每页行数 ) * 8192
总表大小(主表+TOAST表,转换为GB)
总大小(GB)= (主表总大小 + TOAST总大小) / (1024^3)
额外开销说明
- 索引开销:若为timestamp列创建B树索引,索引大小约为表大小的30%-50%,估算时可按表大小的40%额外添加
- 误差余量:实际存储因块对齐、碎片等会有±10%的误差,成本建议预留10%-20%的缓冲空间
内容的提问来源于stack exchange,提问作者Ulderique Demoitre
相关产品推荐
相关产品推荐

