为什么我的 PostgreSQL table 比它来自的 csv 大(以 GB 为单位)?

Why is my PostgreSQL table larger (in GB) than the csv it came from?

< 4 GB csv 在我的 AWS Postgres 实例中变成了 7.7 GB table。一个 14 GB 的 csv 不会加载到 22 GB 的 space,我猜是因为它的大小也会加倍!这个二分之一正常吗?如果是,为什么,它可靠吗?

可能的原因有很多:

  • 索引占用space。如果你有很多索引,尤其是多列索引或 GiST / GIN 索引,它们可能是一个大 space 猪。

  • 某些数据类型以文本形式表示比 table 更紧凑。例如,1 在 csv 中占用 1 个字节(如果算上逗号分隔符,则占用 2 个字节),但如果将其存储在 bigint 列中,则需要 8 个字节。

  • 如果设置了 FILLFACTOR,PostgreSQL 会故意浪费 space,所以让后面的 UPDATEs 和 INSERTs 更快。如果您不知道 FILLFACTOR 是什么,那么没有一组。

  • PostgreSQL 的每行开销比 CSV 大得多。在 CSV 中,换行符和回车符的每行开销为 2 个字节 return。 PostgreSQL table 中的行需要 24 到 28 个字节,加上数据值,主要是因为多版本并发控制所需的元数据。因此,具有很多窄行的 CSV 将产生比具有更少宽行的相同字节大小的 table 大得多的 table。

  • PostgreSQL 可以使用 TOAST 对值进行离线存储和压缩。这可以使大文本字符串在数据库中比在 CSV 中

您可以使用 octet_sizepg_column_size 让 PostgreSQL 告诉您行有多大。由于 TOAST 外联压缩存储,pg_column_size 对于由 VALUES 表达式生成的元组与 SELECT 由 [=58= 生成的元组可能不同].

您还可以使用 pg_total_relation_size 找出给定样本输入的 table 有多大。