关于ABAP排序不稳定的问题

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排序不稳定的问题_第1张图片
优化后:
关于ABAP排序不稳定的问题_第2张图片

Debug发现优化前的代码里面对每一个opportunity的log,有一个SORT之后再取前26条的逻辑:
关于ABAP排序不稳定的问题_第3张图片
问题就出在这个SORT上,发现ABAP里面的SORT是非稳定排序:
同样 SORT KEY的三条数据在排序前的自然顺序:
关于ABAP排序不稳定的问题_第4张图片

     SORT之后这三条的顺序:

关于ABAP排序不稳定的问题_第5张图片
刚好这条opportunity对应的log有27条,这三条log在排序之后在最后,所以ESTAT这条被截掉了,如果是稳定排序的话这条不应该被截掉。

要解决这个问题可以让优化前和优化后的代码都用SORT STABLE,但是SORT STABLE比SORT慢, 而且对于change log来说这个问题造成的不一致是可以接受的,所以暂时不改。要获取更多Jerry的原创文章,请关注公众号"汪子熙":

你可能感兴趣的:(SAP,ABAP)