FOR ALL ENTRIES IN内表排序、排重对性能的影响

来源:互联网 发布:部落冲突 女武神数据 编辑:程序博客网 时间:2024/05/15 20:57

大家都知道for all entries in 关联内表时,要先判断内表不为空 否则会扫描全表,非常消耗服务器内存资源,那么内表关键字段的排序和排重对查询效率有没有影响呢?下面看一个例子
程序代码:

  1. DATA: it_mara TYPE STANDARD TABLE OF mara,
  2. wa_mara TYPE mara,
  3. it_makt TYPE STANDARD TABLE OF makt,
  4. wa_makt TYPE makt,
  5. it_temp_mara TYPE STANDARD TABLE OF mara,
  6. wa_temp_mara TYPE mara.
  7. * Get all the records from MARA
  8. SELECT *
  9. UP TO 100 ROWS
  10. FROM mara
  11. INTO TABLE it_temp_mara.
  12. IF sy-subrc = 0.
  13.   IF NOT it_temp_mara[] IS INITIAL.
  14. * 具有重复数据的内表
  15.     DO 1000 TIMES.
  16.       APPEND LINES OF it_temp_mara TO it_mara.
  17.     ENDDO.
  18.     IF NOT it_mara[] IS INITIAL.
  19. * Select MAKT
  20.       WRITE:/'内表中数据未经排序排重'.
  21.       PERFORM select_makt.
  22. * 排过序的内表
  23.       WRITE:/'内表中数据已排序未排重'.
  24.       SORT it_mara BY matnr.
  25.       PERFORM select_makt.
  26. * 删除了重复数据的内表
  27.       WRITE:/'内表中数据已排序并排重'.
  28.       DELETE ADJACENT DUPLICATES FROM it_mara COMPARING matnr.
  29.       PERFORM select_makt.
  30.     ENDIF.
  31.   ENDIF.
  32. ENDIF.
  33. *&---------------------------------------------------------------------*
  34. *& Form select_makt
  35. *&---------------------------------------------------------------------*
  36. * Select data friom MAKT
  37. *----------------------------------------------------------------------*
  38. FORM select_makt .
  39.   DATA: t1 TYPE i,
  40.   t2 TYPE i,
  41.   tmin TYPE i.
  42.   REFRESH it_makt[].
  43.   GET RUN TIME FIELD t1.
  44.   SELECT *
  45.   FROM makt
  46.   INTO TABLE it_makt
  47.   FOR ALL ENTRIES IN it_mara
  48.   WHERE matnr = it_mara-matnr.
  49.   GET RUN TIME FIELD t2.
  50.   tmin = t2 - t1.
  51.   tmin = tmin .
  52.   WRITE:/ ' Time(ms) = ', tmin.
  53. ENDFORM.                    "select_makt
复制代码
程序执行结果:
 
由上边的执行时间分析,可以得出以下结论:

内表排序和排重都能提高[FOR ALL ENTRIES]查询的效率
1、使用FOR ALL ENTRIES IN时内表中不要有重复的数据
2、对内表进行排序
特别注意第二点,容易被忽略
注意:这里的时间给错了,是us,不是ms毫秒

原创粉丝点击