【问题标题】:Fuzzy timestamp joining in Postesql and achieving better speeds在 Postesql 中加入模糊时间戳并实现更好的速度
【发布时间】:2014-09-05 02:14:27
【问题描述】:

我正在尝试通过匹配时间戳字段(正负一秒)来连接两个表。

SELECT t1.id, t2.id
FROM ctc.table1 t1
    INNER JOIN ctc.table2 t2
        ON EXTRACT(EPOCH FROM t1.timestamp) 
            BETWEEN EXTRACT(EPOCH FROM t2.timestamp) - 1 
                AND EXTRACT(EPOCH FROM t2.timestamp) + 1

有没有更高效的方式来编写这个查询?

【问题讨论】:

  • 是否存在多个匹配项?你能把 epoch 分成 3 秒的间隔然后这样比较吗?
  • 不,因为如果一个距离“三秒纪元”稍早和稍晚,那么两条非常接近的记录将不匹配。
  • 我对 PostgreSQL 不太熟悉,但我知道它有 LATERAL JOIN(类似于 SQL Server 中的 APPLY 概念)。你不能用那个吗?类似(伪代码)“FROM ctc.table1 t1 LATERAL(SELECT ... FROM table2 t2 WHERE t2.timestamp between t1.timestamp - 1 和 t1.timestamp + 1)?
  • 顺便说一句,我会使用ON t1."timestamp" BETWEEN t2."timestamp" - INTERVAL '1' SECOND AND t2."timestamp" + INTERVAL '1' SECOND;,但这主要是装饰性的。
  • 使用索引。不要将数据包装在杀死索引使用的函数中,即't2.timestamp - INTERVAL '1' SECOND' 将使用索引,'EXTRACT(EPOCH FROM t2.timestamp) - 1' 不会。

标签: sql performance postgresql


【解决方案1】:

正如 Dale 在 cmets 中已经指出的那样,

ON t1."timestamp" BETWEEN 
    t2."timestamp" - INTERVAL '1' SECOND AND 
    t2."timestamp" + INTERVAL '1' SECOND

Craig Ringer 提出的变体 可以使用通用索引,而您的变体只能使用专门构建的索引,例如

create index the_index_name on ctc.table1(extract(epoch from timestamp))

【讨论】:

    猜你喜欢
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2015-12-07
    • 2013-03-21
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多