为何Postgres表大小远超源Excel文件(已排除索引)
为何Excel导入PostgreSQL后表大小远大于源文件?
存储格式与数据类型的本质差异:Excel是经过压缩的二进制格式,会对重复值、空白内容做大量优化(比如共享相同字符串、仅存储非空单元格);而PostgreSQL是面向行的关系型存储,每个字段会使用数据库原生数据类型存储——比如Excel里的数字可能用紧凑的浮点数格式,PostgreSQL如果用
numeric或bigint类型,占用的字节数会更多;日期时间在Excel里是浮点数,PostgreSQL则用专门的timestamp类型(固定8字节),这些都会增加单条数据的体积。PostgreSQL的行与块级存储开销:
- 每一行数据都带有行头信息,包含事务ID、可见性标志等元数据,默认占用约23字节(不同版本略有差异),这部分是Excel没有的额外开销;
- 数据以8KB为单位的数据块存储,每个块带有块头信息,即使单条数据很小,也会占用至少一个块的部分空间,剩余空间无法被其他块复用,小行数据多的话,空间浪费会非常明显。
数据对齐与填充的额外占用:PostgreSQL为了提升查询性能,会对字段做内存对齐处理——比如
bool类型(1字节)后紧跟int4类型(4字节)时,会自动填充3字节以满足对齐要求,这些填充字节会累加占用额外空间。TOAST压缩的局限性:虽然PostgreSQL会自动对大字段启用TOAST压缩,但如果你的数据里没有大文本/二进制字段,TOAST不会生效;即便生效,其压缩率也不如Excel针对表格数据的专用压缩算法高,仍会有额外存储开销。
空值存储的差异:Excel对空白单元格不会实际存储内容,而PostgreSQL中即使字段为空,也需要存储空值标记——可变长度字段的空值会占用少量字节的长度标记,固定长度字段的空值则会占满字段的全部长度。
内容的提问来源于stack exchange,提问作者Li Yang
相关产品推荐
相关产品推荐

