优化查询以获取日志表中每个人的最新记录

Posted

技术标签:

【中文标题】优化查询以获取日志表中每个人的最新记录【英文标题】:Optimized query to get the most recent records for each person in a log table 【发布时间】:2021-07-02 20:52:04 【问题描述】:

有没有更好的方法来设置这个查询?

select * 
from peopleLog
where index in (select max(index) index from peopleLog group by personID)

我有一个日志表,每次更新一个人的记录时都会插入该表。记录被添加,而不是被替换。这意味着该表包含每个人的多条记录。我想从这张表中提取每个人最讨厌的记录。该表有大约 30 个字段,所以我认为分组不是最好的选择,但我可能错了。

索引字段是此 SQL Server 表中的标识字段,并设置为自动递增。 personID 是个人的识别号码,是个人唯一的。

【问题讨论】:

【参考方案1】:

你可以使用窗口函数来代替:

select * from (
   select * , row_number() over (partition by personID order by index desc) rn
   from peopleLog
) t where t.rn = 1

personId 和“index”列的索引也会有所帮助)

【讨论】:

【参考方案2】:

通常相关子查询具有最佳性能:

select pl.* 
from peopleLog pl
where pl.index = (select max(pl2.index)
                  from peopleLog pl2
                  where pl2.personID = pl.personID
                 );

特别是,这可以利用peopleLog(personID, index) 上的索引。

【讨论】:

以上是关于优化查询以获取日志表中每个人的最新记录的主要内容,如果未能解决你的问题,请参考以下文章

MySQL查询从具有1000万行的表中获取每个条目的最新记录

从更优化的 2 个表中获取 MySQL 的最新记录 [重复]

优化查询以从不同的表中获取唯一(用户)记录

MySQL查询优化从大表中获取8-10条记录

通过 linq 对实体查询进行分组,以通过加入表来获取具有最新时间戳的一条记录

如何查询 sql 以获取最新的记录日期,但如果记录有消息返回该 reocrd [关闭]