如何检索每个类别的最后一条记录(更快的方式)

Posted

技术标签:

【中文标题】如何检索每个类别的最后一条记录(更快的方式)【英文标题】:How to retrieve last record of each category( faster way ) 【发布时间】:2019-06-08 10:13:12 【问题描述】:

我使用 Oracle 作为 DBMS 并且有一个大表(400,000,000 条记录)。现在,我想检索每个类别的最后一条记录。当我使用如下所示的“分组依据”时,需要很长时间。有更快的方法吗?

注意:我需要检索所有表的数据:

select * 
from myTable tb1
inner join 
    (select MAX(id) max_id, categoryColumn 
     from myTable 
     group by categoryColumn) tb2 on tb1.id = tb2.max_id

【问题讨论】:

【参考方案1】:

你可以试试窗口函数:

select t.*
from (select t.*, 
             row_number() over (partition by categoryColumn order by id desc) as seqnum
      from mytable t
     ) t
where seqnum = 1;

我会推荐一个关于(categoryColumn, id desc) 的索引。

使用此索引,您可能会发现相关子查询更快:

select t.*
from mytable t
where t.id = (select max(t2.id)
              from mytable t2
              where t2.categoryColumn = t.categoryColumn
             );

虽然我认为上面的方法更快,但我使用keep 的性能很好。语法比较繁琐:

select categoryColumn, max(id) as id,
       max(col1) keep (dense_rank first order by id desc) as col1,
       max(col2) keep (dense_rank first order by id desc) as col2,
       . . .  -- and so on for each column
from mytable t
group by categoryColumn;

【讨论】:

TNX 戈登。我为 1000000 条记录执行了上述脚本,但“JOIN”更快。还有其他更快的方法吗? @Yaser 。 . .你有推荐的索引吗? 我在 'categoryColumn' 和 'id' 列上分别创建了索引。当我将 that_(categoryColumn, id desc) 更改为 index_ 时,相关子查询会更好(12% 到 25%)。 TNX 很多。

以上是关于如何检索每个类别的最后一条记录(更快的方式)的主要内容,如果未能解决你的问题,请参考以下文章

检索每个组中的最后一条记录 - MySQL

检索每个组中的最后一条记录 - MySQL

检索每个组中的最后一条记录 - MySQL

检索每个组中的最后一条记录 - MySQL

检索每个组中的最后一条记录 - MySQL

检索每个组中的最后一条记录 - MySQL