为什么PostgreSQL(timescaledb)会占用更多的存储空间?

Xia*_*ang 3 database postgresql timescaledb

我是数据库的新手.最近我开始使用timecaledb,这是PostgreSQL的扩展,所以我猜这也与PostgreSQL有关.

我观察到一种奇怪的行为.我计算了我的表结构,1个时间戳,2个双倍,所以每行总共24个字节.我从csv文件导入(通过psycopg2 copy_from)2,750,182行.我手动计算的大小应该是63MB,但我查询timescaledb,它告诉我的表大小为137MB,指数大小为100MB,总237MB.我期待表格大小应该等于我的计算,但事实并非如此.任何的想法?

dav*_*idk 10

您的表大于预期有两个基本原因:1.Postgres中的每个元组开销2.索引大小

  1. 每个元组开销: 相关问题的答案详细说明我不会在这里重复, 但基本上Postgres每行使用23(+填充)字节用于各种内部事务,主要是多版本并发控制(MVCC)管理(Bruce Momjian)如果你想要更多的信息,有一些很好的介绍).这让你非常接近你所看到的137 MB.剩下的可能是因为表的填充因子设置或者表中是否还有任何死行,例如前一个插入和后续删除.
  2. 索引大小:与其他一些DBMS不同,Postgres不会在索引上的磁盘上组织其表,除非您在索引上手动群集表,即使这样,它也不会随着时间的推移而维护群集(请参阅https://www.postgresql. org/docs/10/static/sql-cluster.html).相反,它会单独保留其索引,这就是为什么索引有额外的空间.如果磁盘大小对您来说非常重要,并且您没有使用索引,例如,唯一性约束强制执行,那么您可能会考虑使用BRIN索引,尤其是当您的数据以某种顺序进行时(请参阅https:// www .postgresql.org/docs/10/static/brin-intro.html).