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