2016-03-03 39 views
0

我想提高我的数据库,简化装配的性能PostgreSQL的性能提示如下:散乱数据

编辑

  • 一个表有3行(id_device,时间戳,数据)与复合B树索引(id_device,时间戳)
  • 1K设备发送数据的每一分钟

插入速度非常快,因为PostgreSQL只是按照收到的顺序写入行。但是,当试图通过给定设备的连续时间戳获取多个数据时,查询速度并不快。我的理解是,由于收集数据的方式,表格每页上的给定设备的行数不会超过一行。因此,如果我想要获得给定设备连续时间戳的10k数据,PostgreSQL必须从磁盘读取10k页。此外,由于可以在任何1k设备上完成此操作,因此这些页面不会保存在RAM中。

我试过CLUSTER表,它确实解决了性能问题,但是这个操作非常长(〜1天),并且锁定了整个表,所以我放弃了这个解决方案。

我已经阅读了有关分区的内容,但是如果每次连接新设备时都需要添加新表格,这就意味着需要大量脚本,并且在我看来,这有点容易出错。

我对这个设置不是特别原创的事实很有信心,那么我可以使用一个建议吗?

感谢您的阅读, 纪尧姆

+0

如果您的查询只检查时间戳,则应该仅在时间戳上添加索引。 – Renzo

+0

我编辑了这个问题,因为我的设置过于简单。还有一些数据可以检索。 – gdlr

回答

0

我猜你的指数也有选择性低,因为你第一次索引DEVICE_ID(这是唯一的1000个不同的),而不是时间戳第一。

取决于您对提取的数据所做的操作,但也许解决方案可能会对操作进行批处理,例如在预定时段内提取数据并一次处理所有1000个设备的数据。

+0

批处理操作确实是我正在考虑的操作,并将处理后的数据存储在另一个表中。我正在考虑日常工作,它会将每天的数据列表存储为一行,以便这些数据保持在一起。但是,我的问题实际上是:我正确使用PostgreSQL还是缺少一些东西? – gdlr

+0

我不认为这里有很多事情要做。您在PostgreSQL中存储数据时,如果您无法分割它,例如。根据device_id,那么唯一合理的解决方案就是批量处理数据,因为如果你触摸每一千条记录或全部记录,它没有多大区别。 – hruske

+0

感谢您的回复。我不知道分片,我会看看这个。 – gdlr