且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

关于ABAP排序不稳定的问题

更新时间:2022-08-21 18:54:00

Tuesday, February 16, 2016 11:58 AM


这是我的同事Ben发现的,我做ABAP开发这么多年都没留意过,惭愧。


首先我们回顾下大学计算机专业课数据结构中讲的,排序的稳定性。假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。


这两天在做change document优化的时候遇到一个ABAP SORT不稳定性带来的问题:


测试发现优化前和优化后,取到的100多条log里面有一条不一样:

优化前:

关于ABAP排序不稳定的问题

优化后:


关于ABAP排序不稳定的问题

Debug发现优化前的代码里面对每一个opportunity的log,有一个SORT之后再取前26条的逻辑:

关于ABAP排序不稳定的问题

问题就出在这个SORT上,发现ABAP里面的SORT是非稳定排序:

同样 SORT KEY的三条数据在排序前的自然顺序:

关于ABAP排序不稳定的问题

刚好这条opportunity对应的log有27条,这三条log在排序之后在最后,所以ESTAT这条被截掉了,如果是稳定排序的话这条不应该被截掉。


要解决这个问题可以让优化前和优化后的代码都用SORT STABLE,但是SORT STABLE比SORT慢, 而且对于change log来说这个问题造成的不一致是可以接受的,所以暂时不改。