首页 > 解决方案 > 如何在 PostgreSQL 中处理大型数据集?

问题描述

我有一个具有这种结构的表:id、value、metric、timestamp,并且在(id、metric、timestamp)列上有一个主键索引。我以每 10 秒 1M 的速率传入数据,因此您可以想象到一天结束时我最终会得到一个大型数据库。我需要使用以下简单算法对数据进行下采样:获取超过一小时的数据,并将每个指标的所有记录减少到每 10 分钟 1 条。为了做到这一点,我实现了 java 服务,它每小时获取最后一小时的特定指标的记录,选择要删除的记录,并批量生成 1000 个 DELETE 语句并将其发送到 postresql。

我生成每个删除语句的方式是:

DELETE FROM TABLE WHERE id = :id, metric = :metric, timestamp = :timestamp;
DELETE FROM TABLE WHERE id = :id, metric = :metric, timestamp = :timestamp;
DELETE FROM TABLE WHERE id = :id, metric = :metric, timestamp = :timestamp;

bc 3 列上的索引。当我尝试按 id 删除时(它只是一个串行字段,而不是主键),它很慢。

无论如何,我试图执行我的解决方案,但它没有赶上。删除数据真的很慢。我不想使用 PostreSQL 存储过程,因为我希望代码更灵活:使用并行处理等。有什么建议可以提高性能吗?我正在使用 PostgreSQL 12。

标签: databasepostgresql

解决方案


如果基于索引的删除很慢,原因一定是有指向未正确索引的表的外键。


推荐阅读