假设我有一个日志更改表。每个更改都可以覆盖同一组和同一模块的其他更改。我想获得一个更改列表以及在一个SELECT语句中覆盖的最后一个更改。如何才能获得最佳性能?
请在答案中使用这些表/列名称:
我试着遵循这个很棒的答案:SQL join: selecting the last records in a one-to-many relationship 但是性能不是很好,我说的是一个包含超过一百万行的表,并且有两个不同(可能是因为这不是正确答案),连接是使用相同的表和两列。
我尝试使用LAG功能,但性能不佳。 当我谈论糟糕的表现时,这意味着所有的桌子花费的时间超过5秒,我正试图获得更好的时间。
编辑:
如果我有:
id groupid moduleid date
1 1 1 2016/09/07
2 1 1 2016/09/06
3 1 1 2016/09/05
4 1 2 2016/09/07
5 1 2 2016/09/06
6 2 3 2016/09/07
7 2 3 2016/09/08
查询应返回:
id last
1 2
2 3
3 (0 or null)
4 5
5 (0 or null)
6 7
7 (0 or null)
有意义吗?
答案 0 :(得分:0)
如果您正在处理数百万条被评估的记录,那么您所做的任何事情都需要一些时间。多长时间取决于您的硬件。如果您可以使用某种过滤器(使用所讨论的表上支持的索引)来减少查询,则无论查询如何,您都可以获得更快的结果。我认为LAG窗口函数往往是您最快的方法,但是这会受到您是否有一个索引可以按照与LAG中的分区和顺序对应的顺序检索数据的影响。拥有该索引将允许引擎避免昂贵的排序操作。