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

标签 postgresql csv size filesize amazon-rds

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

最佳答案

有很多可能的原因:

  • 索引占用空间。如果您有很多索引,尤其是多列索引或 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 表达式生成的元组与一个 生成的元组可能不同从表中选择

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

关于postgresql - 为什么我的 PostgreSQL 表比它来自的 csv 更大(以 GB 为单位)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29221846/

相关文章:

Qt - 如何使用 Qt 界面列出 PostgreSQL 服务器上的所有现有数据库

postgresql - PostgreSQL如何full join : counting number of events by day

postgresql - jsonb 属性列的 AR 查询

bash - 在 Postgres 日志记录机制中更改定界符和换行符

php - 如何正确导出到包含带逗号的表记录值的 CSV 文件?

csv - 如何将本地 ORC 文件转换为 CSV?

c - 如何在不使用 fseek 或 stat 的情况下在 C 中获取文件的大小?

mysql - 每条街道的 LibreOffice Calc 电子表格 : Find highest house number, 并仅显示这些行

Android:如何使用大量的Bitmaps?

css - 当浏览器尺寸减小时,只有第一张图片留在 View 中