A< 4 GB csv成为我的AWS Postgres实例中的7.7 GB表。一个14 GB的csv不会加载到22 GB的空间,我猜测是因为它的尺寸也会增加一倍!这个因素是两个正常吗?如果是这样,为什么,它是否可靠?
答案 0 :(得分:11)
有很多可能的原因:
索引占用空间。如果你有很多索引,特别是多列索引或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
可能与表格中的SELECT
表达式不同{/ 1}}。
您还可以使用pg_total_relation_size
找出给定样本输入的表格有多大。