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

Eri*_*rin 4 csv postgresql size filesize amazon-rds

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

Cra*_*ger 13

有许多可能的原因:

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

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

  • 如果有一个FILLFACTOR集合,PostgreSQL会故意浪费空间,所以后来UPDATEs和INSERTs更快.如果你不知道是什么FILLFACTOR,那就没有一套.

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

  • PostgreSQL可以使用TOAST.进行外部存储和压缩值.这可以使数据库中的大文本字符串比CSV中的大文本字符串小得多.

您可以使用octet_sizepg_column_size获取PostgreSQL来告诉您行的大小.由于TOAST外部压缩存储,表达式pg_column_size生成的元组VALUESSELECT表中的一个元组可能不同.

您还可以使用pg_total_relation_size查找给定样本输入的表的大小.