database - 如何在 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。
解决方案
如果基于索引的删除很慢,原因一定是有指向未正确索引的表的外键。
推荐阅读
- c++ - OpenGL 立体视图——如何使用 GLM 数学库进行水平偏移
- sql - 基于时间的分页
- sql - 基础函数更改后重新计算 Postgres 生成的列中的值
- javascript - ReferenceError:在使用 React Aria 覆盖时,文档未在 Next.js 中定义
- r - R函数过滤掉每日数据
- python - CNN for 5 Classifications: ValueError: Shapes (None, 228, 228, 1) and (None, 1) is incompatible
- matlab - Octave:如何索引数组的单个元素?
- c# - 带有输出参数的 Dynamics CRM 工作流继承
- firebase - 云构建:即使我授予了 blob 的签名权限,也没有权限
- html - 使div的宽度没有到达页面的末尾