技术开发 频道

ABAP性能实例七例

    13.Sorting internal tables

    内表中指定的排序键限制越严格,程序运行得就越快。所以,尽可能的指定约束越多的排序键值。

    SORT ITAB.
    

    SORT ITAB BY K.

    14.Simple Algorithms

    14.1.Joining internal tables(内表连接Join)

    如果ITAB1有n1条记录,ITAB2有n2条记录, 那么straightforward算法连接ITAB1和ITAB2需要O( n1 * log2( n2 ) )次运算,而parallel cursor approach仅需要O( n1 + n2 ) 次运算。
    parallel cursor算法假定ITAB2为从表且只包含在主表ITAB1中才有的记录. If this assumption does not hold, the parallel cursor algorithm gets slightly more complicated, but its performance characteristics remain the same.

    LOOP AT ITAB1 INTO WA1.

      READ TABLE ITAB2 INTO WA2

                 WITH KEY K = WA1-K BINARY SEARCH.

      IF SY-SUBRC = 0.

        " ...

      ENDIF.

    ENDLOOP.

    <Naive join>

    

    DATA: I TYPE I.

    I = 1.

    LOOP AT ITAB1 INTO WA1.

      READ TABLE ITAB2 INTO WA2 INDEX I.

      IF SY-SUBRC <> 0. EXIT. ENDIF.

      IF WA2-K = WA1-K.

        " ...

      ENDIF.

    ENDLOOP.

    注:经过本人测试,这段程序是错误的,不能成立,不知道正确的应该如何。

    <More sophisticated: use parallel cursors>

    14.2.Nested loops

    如果ITAB1有n1条记录,ITAB2有n2条记录,那么嵌套loop的straightforward算法需要的时间为O(n1 * n2),而parallel cursor approach 需要的时间是O(n1 + n2).

    parallel cursor算法假定 ITAB2仅包含ITAB1才有的记录。如果假定不成立, parallel cursor算法显得比较复杂,但是性能特性却保持不变。

    LOOP AT ITAB1 INTO WA1.

      LOOP AT ITAB2 INTO WA2

                    WHERE K = WA1-K.

        " ...

      ENDLOOP.

    ENDLOOP.

    <Straightforward nested loop>

    I = 1.

    LOOP AT ITAB1 INTO WA1.

      LOOP AT ITAB2 INTO WA2 FROM I.

        IF WA2-K <> WA1-K.

          I = SY-TABIX.

          EXIT.

        ENDIF.

        " ...

      ENDLOOP.

    ENDLOOP.

    < More sophisticated loop: parallel cursors >

0
相关文章