5

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

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

4

1 回答 1

13

您的表比您预期的大有两个基本原因: 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)。
于 2018-01-09T18:38:13.500 回答