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

时间:2017-11-23 21:53:01

标签: database postgresql timescaledb

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

我发现了一种奇怪的行为。我计算了我的表结构,1个时间戳,2个双倍,所以每行总共24个字节。我从csv文件导入(通过psycopg2 copy_from)2,750,182行。我手动计算的大小应该是63MB,但我查询时间表,它告诉我表大小是137MB,索引大小是100MB,总共237MB。我期待表格大小应该等于我的计算,但它并没有。有什么想法吗?

1 个答案:

答案 0 :(得分:8)

您的餐桌比您预期的要大两个基本原因: 1. Postgres中的元组开销 2.指数大小

  1. 每个元组开销: An answer to a related question goes into detail that I won't repeat here但基本上Postgres每行使用23(+填充)字节用于各种内部事务,主要是多版本并发控制(MVCC)管理({{3如果你想要更多信息)。这让你非常接近你所看到的137 MB。剩下的可能是因为表的填充因子设置或者表中是否还有任何死行,例如前一个插入和后续删除。
  2. 索引大小:与其他一些DBMS不同,Postgres不会在索引上的磁盘上组织其表,除非您在索引上手动群集表,即使这样,它也不会随着时间的推移维持群集(见Bruce Momjian has some good intros)。相反,它会单独保留其索引,这就是为什么索引有额外的空间。如果磁盘大小对您来说非常重要,并且您没有使用索引来执行唯一性约束,那么您可能会考虑使用BRIN索引,尤其是当您的数据以某种顺序进行时(请参阅{{3 }})。