首页 > 解决方案 > 为一组 id 的大表有效地获取最大时间戳

问题描述

我有一个大型 PostgreSQL 数据库表(实际上有很多分区表按年度季度划分),为简单起见,它被定义为

id bigint
ts (timestamp)
value (float)

对于一组特定的 id,在表中为每个指定的 id 找到最后一个时间戳的有效方法是什么?

该表由(id,timestamp)索引

如果我做一些天真的事情

SELECT sensor_id, MAX(ts) 
FROM sensor_values 
WHERE ts >= (NOW() + INTERVAL '-100 days') :: TIMESTAMPTZ 
GROUP BY 1;

事情进展得很慢。

有没有办法通过对一个 id 进行二分搜索来缩小时间范围(我可以假设时间戳对于一组特定的 id 是相似的)

我正在通过 psycopg 访问数据库,因此如果我遗漏了一些容易加快速度的东西,解决方案可以是代码或 SQL。

查询的解释可以在这里看到。https://explain.depesz.com/s/PVqg

任何想法表示赞赏。

标签: postgresqlquery-performancedatabase-partitioning

解决方案


推荐阅读