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

时间:2015-03-23 22:46:03

标签: postgresql csv size filesize amazon-rds

A< 4 GB csv成为我的AWS Postgres实例中的7.7 GB表。一个14 GB的csv不会加载到22 GB的空间,我猜测是因为它的尺寸也会增加一倍!这个因素是两个正常吗?如果是这样,为什么,它是否可靠?

1 个答案:

答案 0 :(得分:11)

有很多可能的原因:

  • 索引占用空间。如果你有很多索引,特别是多列索引或GiST / GIN索引,它们可能是一个很大的空间。

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

  • 如果设置了FILLFACTOR,PostgreSQL会故意浪费空间,以便以后UPDATEINSERT更快。如果您不知道FILLFACTOR是什么,那么就没有一套。

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

  • PostgreSQL可以使用TOAST进行值的外部存储和压缩。这可以使数据库中的大文本字符串显着较小而不是CSV。

您可以使用octet_sizepg_column_size让PostgreSQL告诉您行的大小。由于TOAST线外压缩存储,pg_column_size表达式生成的元组VALUES可能与表格中的SELECT表达式不同{/ 1}}。

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