如何检索每个类别的最后一条记录(更快的方式)
How to retrieve last record of each category( faster way )
我使用 Oracle 作为 DBMS,并且有一个很大的 table(400,000,000 条记录)。现在,我想检索每个类别的最后一条记录。当我如下所示使用 "group by" 时,需要很长时间。有没有更快的方法?
注意:我需要检索所有 table 的数据:
select *
from myTable tb1
inner join
(select MAX(id) max_id, categoryColumn
from myTable
group by categoryColumn) tb2 on tb1.id = tb2.max_id
您可以尝试 window 功能:
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;
我使用 Oracle 作为 DBMS,并且有一个很大的 table(400,000,000 条记录)。现在,我想检索每个类别的最后一条记录。当我如下所示使用 "group by" 时,需要很长时间。有没有更快的方法?
注意:我需要检索所有 table 的数据:
select *
from myTable tb1
inner join
(select MAX(id) max_id, categoryColumn
from myTable
group by categoryColumn) tb2 on tb1.id = tb2.max_id
您可以尝试 window 功能:
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;