SELECT COUNT(*) WHERE DATE_PART(...) 在 PostgreSQL/TimescaleDB 中速度较慢

Nyx*_*nyx 1 sql postgresql datetime count query-optimization

为了查找表中每小时存在的行数temperatures,我在带有 TimescaleDB 1.6.0 扩展的 PostgreSQL 11.2 数据库上运行了一系列 SQL 查询。temperatures是一个 TimescaleDB 超表。

例如,

SELECT COUNT(*) FROM temperatures
    WHERE DATE_PART('year', "timestamp") = 2020
    AND DATE_PART('month', "timestamp") = 2
    AND DATE_PART('day', "timestamp") = 2
    AND DATE_PART('hour', "timestamp") = 0
    AND DATE_PART('minute', "timestamp") = 0
Run Code Online (Sandbox Code Playgroud)

问题:但是,这个查询似乎非常慢(我认为),每个查询大约需要 6-8 秒,并且该数据库上没有运行其他查询。该表temperatures包含 1150 万行。每小时大约有 100-2000 行。

寻找有关提高此类查询速度的建议。谢谢!

GMB*_*GMB 5

不要在时间戳列上应用日期函数:这需要对每行(总共 5 行)进行重复计算,并阻止数据库利用时间戳列上的现有索引:

这应该更快:

select count(*)
from temperatures
where 
    timestamp >= '2020-02-02 00:00:00'::timestamp 
    and timestamp < '2020-02-01 00:01:00'::timestamp
Run Code Online (Sandbox Code Playgroud)

此查询使用半开间隔策略根据两个常量值检查时间戳列。