【问题标题】:SELECT COUNT(*) WHERE DATE_PART(...) is Slow in PostgreSQL/TimescaleDBSELECT COUNT(*) WHERE DATE_PART(...) 在 PostgreSQL/TimescaleDB 中很慢
【发布时间】:2020-05-18 17:44:55
【问题描述】:

要查找表 temperatures 中每小时存在的行数,我在我的 PostgreSQL 11.2 数据库上运行了一系列 SQL 查询,扩展名为 TimescaleDB 1.6.0。 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

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

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

【问题讨论】:

    标签: sql postgresql datetime count query-optimization


    【解决方案1】:

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

    这应该更快:

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

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

    【讨论】:

    • 使用::timestamp 对日期时间字符串进行类型转换是否会提高效率?
    • 为什么有'2020-03-01 00:01:00'作为上限?为什么要多出一分钟?不应该是'2020-03-01 00:00:00'吗?
    • @stickybit:实际上我认为上限应该是'2020-02-01 00:01:00'(OP希望所有事情都与'2020-02-02 00:00'在同一分钟内完成。
    • @Nyxynyx: ::timestamp 明确表示我们要进行时间戳比较。
    猜你喜欢
    • 2021-08-29
    • 2023-03-15
    • 2012-10-13
    • 2013-04-10
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    相关资源
    最近更新 更多