大家都知道for all entries in 关联内表时,要先判断内表不为空 否则会扫描全表,非常消耗服务器内存资源,那么内表关键字段的排序和排重对查询效率有没有影响呢?下面看一个例子程序代码:
-
DATA: it_mara TYPE STANDARD TABLE OF mara,
-
wa_mara TYPE mara,
-
it_makt TYPE STANDARD TABLE OF makt,
-
wa_makt TYPE makt,
-
it_temp_mara TYPE STANDARD TABLE OF mara,
-
wa_temp_mara TYPE mara.
-
* Get all the records from MARA
-
SELECT *
-
UP TO 100 ROWS
-
FROM mara
-
INTO TABLE it_temp_mara.
-
IF sy-subrc = 0.
-
IF NOT it_temp_mara[] IS INITIAL.
-
* 具有重复数据的内表
-
DO 1000 TIMES.
-
APPEND LINES OF it_temp_mara TO it_mara.
-
ENDDO.
-
IF NOT it_mara[] IS INITIAL.
-
* Select MAKT
-
WRITE:/'内表中数据未经排序排重'.
-
PERFORM select_makt.
-
* 排过序的内表
-
WRITE:/'内表中数据已排序未排重'.
-
SORT it_mara BY matnr.
-
PERFORM select_makt.
-
* 删除了重复数据的内表
-
WRITE:/'内表中数据已排序并排重'.
-
DELETE ADJACENT DUPLICATES FROM it_mara COMPARING matnr.
-
PERFORM select_makt.
-
ENDIF.
-
ENDIF.
-
ENDIF.
-
*&---------------------------------------------------------------------*
-
*& Form select_makt
-
*&---------------------------------------------------------------------*
-
* Select data friom MAKT
-
*----------------------------------------------------------------------*
-
FORM select_makt .
-
DATA: t1 TYPE i,
-
t2 TYPE i,
-
tmin TYPE i.
-
REFRESH it_makt[].
-
GET RUN TIME FIELD t1.
-
SELECT *
-
FROM makt
-
INTO TABLE it_makt
-
FOR ALL ENTRIES IN it_mara
-
WHERE matnr = it_mara-matnr.
-
GET RUN TIME FIELD t2.
-
tmin = t2 - t1.
-
tmin = tmin .
-
WRITE:/ ' Time(ms) = ', tmin.
-
ENDFORM. "select_makt
复制代码

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