为什么我的 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,所以让后面的 UPDATE
s 和 INSERT
s 更快。如果您不知道 FILLFACTOR
是什么,那么没有一组。
PostgreSQL 的每行开销比 CSV 大得多。在 CSV 中,换行符和回车符的每行开销为 2 个字节 return。 PostgreSQL table 中的行需要 24 到 28 个字节,加上数据值,主要是因为多版本并发控制所需的元数据。因此,具有很多窄行的 CSV 将产生比具有更少宽行的相同字节大小的 table 大得多的 table。
PostgreSQL 可以使用 TOAST
对值进行离线存储和压缩。这可以使大文本字符串在数据库中比在 CSV 中小。
您可以使用 octet_size
和 pg_column_size
让 PostgreSQL 告诉您行有多大。由于 TOAST
外联压缩存储,pg_column_size
对于由 VALUES
表达式生成的元组与 SELECT
由 [=58= 生成的元组可能不同].
您还可以使用 pg_total_relation_size
找出给定样本输入的 table 有多大。
< 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,所以让后面的UPDATE
s 和INSERT
s 更快。如果您不知道FILLFACTOR
是什么,那么没有一组。PostgreSQL 的每行开销比 CSV 大得多。在 CSV 中,换行符和回车符的每行开销为 2 个字节 return。 PostgreSQL table 中的行需要 24 到 28 个字节,加上数据值,主要是因为多版本并发控制所需的元数据。因此,具有很多窄行的 CSV 将产生比具有更少宽行的相同字节大小的 table 大得多的 table。
PostgreSQL 可以使用
TOAST
对值进行离线存储和压缩。这可以使大文本字符串在数据库中比在 CSV 中小。
您可以使用 octet_size
和 pg_column_size
让 PostgreSQL 告诉您行有多大。由于 TOAST
外联压缩存储,pg_column_size
对于由 VALUES
表达式生成的元组与 SELECT
由 [=58= 生成的元组可能不同].
您还可以使用 pg_total_relation_size
找出给定样本输入的 table 有多大。