【问题标题】:Finding Last known occurence given a lookup date in Large dataset在大数据集中查找给定查找日期的最后已知事件
【发布时间】:2012-08-23 00:47:15
【问题描述】:

我有一个特定的设计问题困扰了我很长一段时间。 我有一个大型实时 GPS 位置日志表,其中包含数千个资产的点条目。每项资产每天有数百个积分进入数据库。我有一个索引 IX(asset asc,EventTime asc) 来加快目标资产的点查询。我有一个 LastKnownLocation 表,用于将每个资产与其最近的点相关联。这只为我提供了 CURRENT 最后一个已知的查找。 我的问题是,在给定多个资产的特定查找日期的情况下,有没有人知道一种有效的方法可以查询位置日志表中的最后一个已知位置? “问:2012 年 7 月 1 日结束时我的所有资产都在哪里”

顺便说一句,由于每个资产都使用自己的内部单调事件时间戳报告其点,因此与每个资产相关的表的 LocationLog.LocationLogID auto inc 主键存在隐含的单调关系。这就是我可以使用 MAX Aggregate 的原因。

SELECT MAX(LocationLog.LocationLogID) FROM LocationLog 
WHERE LocationLog.fk_AssetID IN 
(
    //LIST OF required assets for report
) 
AND LocationLog.EventTime <= '2012/07/01 23:59:59'
GROUP BY LocationLog.fk_AssetID

问题在于数据库索引 IX 可以快速访问单个资产的所有点。然后这些点按索引中的事件时间排序,因此 dbengine 可能会在索引中的事件时间内进行数据扫描,以查找日期为

由于我的位置日志有 90+ 百万行,并且像这样增长 1000 个资产查询需要 50 秒。

查找给定查找日期的最后一次已知事件必须是众所周知的设计模式,但是我无法搜索。

PS:运行 MSSQL2000,但正在迁移到 Postgres

【问题讨论】:

  • 您是否尝试在EventTime desc、Asset asc 上添加索引?

标签: sql-server postgresql database-design


【解决方案1】:

这可能有助于消除 IN(...)

试试类似的东西

--
--  index on AssetID, EventTime desc
--
select
      AssetID
    , LocationID
    , EventTime
from LocationLog as a
join (
        select AssetID_1
        union
        select AssetID_2
        union
        select AssetID_3
        -- etc, list of assets needed in report
      ) as b on b.AssetID = a.AssetID
where a.EventTime = (select max(xx.EventTime) 
                       from LocationLog as xx 
                      where xx.AssetID = a.AssetID
                        and xx.EventTime <= '2012-08-28 12:05:00')
;

【讨论】:

    【解决方案2】:

    想到两件事:

    • 维护您的位置的具体化视图,存储每个资产每天的结束位置;或
    • 分区,分区,分区!例如,如果您在每个分区中只有一周的数据,则此类搜索会便宜得多。

    我可能会创建一个end_of_day_location 表,而不是在每天结束时清除我的last_known_location 表,而是首先将INSERT 其内容放入end_of_day_location

    【讨论】:

    • PostgreSQL,迁移目标,不支持物化视图,尽管你可以在某种程度上通过触发器来模仿它们。
    • @Catcall 是的,我知道。我应该明确指出这一点,尽管在 Pg 中使用触发器来维护 mat.views 的惯例如此之多,以至于我忘记了明确指出它。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 2012-03-23
    • 2016-04-13
    • 2018-12-05
    相关资源
    最近更新 更多