文章目录
前言
在开发过程中,不免遇到LOOP套LOOP的情况,那么我们应该怎么选择内表的排序方式呢?
以下为实验结果
实测结果
代码:
REPORT z_loop_test.
DATA: BEGIN OF ls_bkpf,
bukrs TYPE bkpf-bukrs,
belnr TYPE bkpf-belnr,
gjahr TYPE bkpf-gjahr,
END OF ls_bkpf,
lt_bkpf LIKE STANDARD TABLE OF ls_bkpf,
BEGIN OF ls_bseg,
bukrs TYPE bkpf-bukrs,
belnr TYPE bkpf-belnr,
gjahr TYPE bkpf-gjahr,
buzei TYPE bseg-buzei,
END OF ls_bseg,
lt_bseg LIKE STANDARD TABLE OF ls_bseg,
lt_bseg_sort LIKE SORTED TABLE OF ls_bseg WITH NON-UNIQUE KEY bukrs belnr gjahr.
DATA lv_tabix TYPE sy-tabix.
* Timestamp
DATA: lv_period TYPE timestampl,
lv_start LIKE lv_period,
lv_end LIKE lv_period.
START-OF-SELECTION.
SELECT *
FROM bkpf
INTO CORRESPONDING FIELDS OF TABLE lt_bkpf.
IF sy-subrc = 0.
SELECT *
FROM bseg
INTO CORRESPONDING FIELDS OF TABLE lt_bseg.
SELECT *
FROM bseg
INTO CORRESPONDING FIELDS OF TABLE lt_bseg_sort.
ENDIF.
* Binary search try
GET TIME STAMP FIELD lv_start.
SORT lt_bseg BY bukrs ASCENDING
belnr ASCENDING
gjahr ASCENDING.
LOOP AT lt_bkpf INTO ls_bkpf.
READ TABLE lt_bseg WITH KEY bukrs = ls_bkpf-bukrs
belnr = ls_bkpf-belnr
gjahr = ls_bkpf-gjahr
BINARY SEARCH
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
lv_tabix = sy-tabix.
LOOP AT lt_bseg INTO ls_bseg
FROM lv_tabix.
IF ls_bseg-bukrs <> ls_bkpf-bukrs
OR ls_bseg-belnr <> ls_bkpf-belnr
OR ls_bseg-gjahr <> ls_bkpf-gjahr.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
ENDLOOP.
GET TIME STAMP FIELD lv_end.
lv_period = lv_end - lv_start.
WRITE / 'Binary search test'.
WRITE / lv_period.
* Sorted table test
GET TIME STAMP FIELD lv_start.
LOOP AT lt_bkpf INTO ls_bkpf.
LOOP AT lt_bseg_sort INTO ls_bseg
WHERE bukrs = ls_bkpf-bukrs
AND belnr = ls_bkpf-belnr
AND gjahr = ls_bkpf-gjahr.
ENDLOOP.
ENDLOOP.
GET TIME STAMP FIELD lv_end.
lv_period = lv_end - lv_start.
WRITE / 'Sorted table test'.
WRITE / lv_period.
结论
大数据量采用SORT表比使用binary search要快
小数据量使用binary search比采用SORT表快
开发时根据实际数据量选择