#ROW_NUMBER()# #PARTITION#
现在log表中有重复电票号的数据,每条记录的修改时间不一样。我想用每个电票号最新修改的数据,怎么做?
传统方案:
select a.* from
(select electric_draft_id,max(id) max_last
from tbl_swt_business_log
group by electric_draft_id) b
inner join tbl_swt_business_log a
on ( a.id = b.max_last);
执行计划

走了一个全表索引。
使用row_number() 和partition后:
select *
from(
select a.*,ROW_NUMBER() OVER (PARTITION BY electric_draft_id ORDER BY id DESC) as rn
from tbl_swt_business_log a
) t
where rn=1;
执行计划:

当前数据量:

测试下来:似乎传统方式 即使走了两层全表查询,速度依然比ROW_NUMBER()要快?!
不知道是Oracle对表的优化,还是因为数据量太少,看不出效果。等哪天我重做百万的数据,再次测试一下。
文章讨论了在log表中处理重复电票号时,如何选择使用传统SQL(基于全表索引)与ROW_NUMBER()函数结合PARTITIONBY进行最新数据提取。作者发现尽管ROW_NUMBER()方法理论上更高效,但在当前小数据量下,传统方式速度更快,可能受Oracle优化和数据量影响。作者计划在大数据集上进一步测试性能。
743

被折叠的 条评论
为什么被折叠?



