< 4 GB 的 csv 在我的 AWS Postgres 实例中变成了 7.7 GB 的表。一个 14 GB 的 csv 不会加载到 22 GB 的空间中,我猜是因为它的大小也会加倍!这个二分之一正常吗?如果是这样,为什么,它可靠吗?
最佳答案
有很多可能的原因:
索引占用空间。如果您有很多索引,尤其是多列索引或 GiST/GIN 索引,它们可能会占用大量空间。
某些数据类型以文本形式表示比以表格形式更紧凑。例如,
1
在 csv 中占用 1 个字节(如果算上逗号分隔符,则占用 2 个字节),但如果将其存储在bigint
列中,则需要 8 个字节。如果设置了
FILLFACTOR
,PostgreSQL 将故意浪费空间,因此使以后的UPDATE
和INSERT
更快。如果您不知道FILLFACTOR
是什么,那么这里没有一组。PostgreSQL 的每行开销比 CSV 大得多。在 CSV 中,换行符和回车符的每行开销为 2 个字节。 PostgreSQL 表中的行需要 24 到 28 个字节,加上数据值,这主要是因为多版本并发控制所需的元数据。因此,包含很多窄行的 CSV 生成的表格要比具有较少宽行的相同字节大小的表格大得多。
PostgreSQL 可以使用
TOAST
对值进行离线存储和压缩。这可以使数据库中的大文本字符串比 CSV 中的大文本字符串小。
您可以使用 octet_size
和 pg_column_size
让 PostgreSQL 告诉您行有多大。由于 TOAST
外联压缩存储,pg_column_size
对于由 VALUES
表达式生成的元组与一个 生成的元组可能不同从表中选择
。
您还可以使用 pg_total_relation_size
找出给定样本输入的表有多大。
关于postgresql - 为什么我的 PostgreSQL 表比它来自的 csv 更大(以 GB 为单位)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29221846/