В случае с ЕИ согласен, стандартная таблица работает незначительно быстрее. Но если заполнять, например, наименования материалов, то разница будет очень ощутима. Ниже результаты теста и листинг.
Всего записей в таблице - 225.577
Уникальных ЕИ - 19
Уникальных материалов - 12.830
Время выполнения
75.346.455 Perform FILL_MAKTX_TEST_STANDARD
7.808.434 Perform FILL_MAKTX_TEST_SORTED
6.117.128 Perform FILL_MAKTX_TEST_HASHED
5.972.692 Perform FILL_MSEHL_TEST_SORTED
5.771.199 Perform FILL_MSEHL_TEST_HASHED
5.347.074 Perform FILL_MSEHL_TEST_STANDARD
Листинг
REPORT z_read_table_test.
DATA:
BEGIN OF gt_table OCCURS 0,
matnr TYPE matnr,
maktx TYPE maktx,
meins TYPE meins,
msehl TYPE msehl,
END OF gt_table,
gt_t006a TYPE STANDARD TABLE OF t006a,
gt_makt TYPE STANDARD TABLE OF makt.
FIELD-SYMBOLS:
<wa_table> LIKE LINE OF gt_table,
<wa_t006a> LIKE LINE OF gt_t006a,
<wa_makt> LIKE LINE OF gt_makt.
INITIALIZATION.
START-OF-SELECTION.
PERFORM main.
*&---------------------------------------------------------------------*
*& Form main
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM main.
SELECT *
FROM t006a
INTO TABLE gt_t006a
WHERE spras EQ 'R'.
SELECT *
FROM makt
INTO TABLE gt_makt
WHERE spras EQ 'R'.
SORT gt_t006a BY msehi.
SORT gt_makt BY matnr.
SELECT matnr meins
INTO CORRESPONDING FIELDS OF TABLE gt_table
FROM z_big_data_table
WHERE gjahr GE 2010.
DO 100 TIMES.
PERFORM fill_msehl_test_standard.
PERFORM fill_msehl_test_sorted.
PERFORM fill_msehl_test_hashed.
PERFORM fill_maktx_test_standard.
PERFORM fill_maktx_test_sorted.
PERFORM fill_maktx_test_hashed.
ENDDO.
ENDFORM. "main
*&---------------------------------------------------------------------*
*& Form get_msehl
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->MEINS text
* -->MSEHL text
*----------------------------------------------------------------------*
FORM get_msehl USING meins CHANGING msehl.
READ TABLE gt_t006a WITH KEY msehi = meins ASSIGNING <wa_t006a> BINARY SEARCH.
CHECK sy-subrc EQ 0.
msehl = <wa_t006a>-msehl.
ENDFORM. "get_msehl
*&---------------------------------------------------------------------*
*& Form get_maktx
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->MATNR text
* -->MAKTX text
*----------------------------------------------------------------------*
FORM get_maktx USING matnr CHANGING maktx.
READ TABLE gt_makt WITH KEY matnr = matnr ASSIGNING <wa_makt> BINARY SEARCH.
CHECK sy-subrc EQ 0.
maktx = <wa_makt>-maktx.
ENDFORM. "get_maktx
*&---------------------------------------------------------------------*
*& Form fill_msehl_test_standard
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM fill_msehl_test_standard.
DATA lt_t006a TYPE STANDARD TABLE OF t006a.
DATA ls_t006a TYPE t006a.
LOOP AT gt_table ASSIGNING <wa_table>.
READ TABLE lt_t006a INTO ls_t006a WITH KEY msehi = <wa_table>-meins.
IF sy-subrc <> 0.
ls_t006a-msehi = <wa_table>-meins.
PERFORM get_msehl USING ls_t006a-msehi CHANGING ls_t006a-msehl.
IF sy-subrc <> 0.
CLEAR ls_t006a-msehl.
ENDIF.
INSERT ls_t006a INTO TABLE lt_t006a.
ENDIF.
<wa_table>-msehl = ls_t006a-msehl.
ENDLOOP.
ENDFORM. "fill_msehl_test_standard
*&---------------------------------------------------------------------*
*& Form fill_msehl_test_sorted
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM fill_msehl_test_sorted.
DATA lt_t006a TYPE SORTED TABLE OF t006a WITH UNIQUE KEY msehi.
DATA ls_t006a TYPE t006a.
LOOP AT gt_table ASSIGNING <wa_table>.
READ TABLE lt_t006a INTO ls_t006a WITH TABLE KEY msehi = <wa_table>-meins.
IF sy-subrc <> 0.
ls_t006a-msehi = <wa_table>-meins.
PERFORM get_msehl USING ls_t006a-msehi CHANGING ls_t006a-msehl.
IF sy-subrc <> 0.
CLEAR ls_t006a-msehl.
ENDIF.
INSERT ls_t006a INTO TABLE lt_t006a.
ENDIF.
<wa_table>-msehl = ls_t006a-msehl.
ENDLOOP.
ENDFORM. "fill_msehl_test_sorted
*&---------------------------------------------------------------------*
*& Form fill_msehl_test_hashed
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM fill_msehl_test_hashed.
DATA lt_t006a TYPE HASHED TABLE OF t006a WITH UNIQUE KEY msehi.
DATA ls_t006a TYPE t006a.
LOOP AT gt_table ASSIGNING <wa_table>.
READ TABLE lt_t006a INTO ls_t006a WITH TABLE KEY msehi = <wa_table>-meins.
IF sy-subrc <> 0.
ls_t006a-msehi = <wa_table>-meins.
PERFORM get_msehl USING ls_t006a-msehi CHANGING ls_t006a-msehl.
IF sy-subrc <> 0.
CLEAR ls_t006a-msehl.
ENDIF.
INSERT ls_t006a INTO TABLE lt_t006a.
ENDIF.
<wa_table>-msehl = ls_t006a-msehl.
ENDLOOP.
ENDFORM. "fill_msehl_test_hashed
*&---------------------------------------------------------------------*
*& Form fill_maktx_test_standard
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM fill_maktx_test_standard.
DATA lt_makt TYPE STANDARD TABLE OF makt.
DATA ls_makt TYPE makt.
LOOP AT gt_table ASSIGNING <wa_table>.
READ TABLE lt_makt INTO ls_makt WITH KEY matnr = <wa_table>-matnr.
IF sy-subrc <> 0.
ls_makt-matnr = <wa_table>-matnr.
PERFORM get_maktx USING ls_makt-matnr CHANGING ls_makt-maktx.
IF sy-subrc <> 0.
CLEAR ls_makt-maktx.
ENDIF.
INSERT ls_makt INTO TABLE lt_makt.
ENDIF.
<wa_table>-maktx = ls_makt-maktx.
ENDLOOP.
ENDFORM. "fill_maktx_test_standard
*&---------------------------------------------------------------------*
*& Form fill_maktx_test_sorted
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM fill_maktx_test_sorted.
DATA lt_makt TYPE SORTED TABLE OF makt WITH UNIQUE KEY matnr.
DATA ls_makt TYPE makt.
LOOP AT gt_table ASSIGNING <wa_table>.
READ TABLE lt_makt INTO ls_makt WITH TABLE KEY matnr = <wa_table>-matnr.
IF sy-subrc <> 0.
ls_makt-matnr = <wa_table>-matnr.
PERFORM get_maktx USING ls_makt-matnr CHANGING ls_makt-maktx.
IF sy-subrc <> 0.
CLEAR ls_makt-maktx.
ENDIF.
INSERT ls_makt INTO TABLE lt_makt.
ENDIF.
<wa_table>-maktx = ls_makt-maktx.
ENDLOOP.
ENDFORM. "fill_maktx_test_sorted
*&---------------------------------------------------------------------*
*& Form fill_maktx_test_hashed
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM fill_maktx_test_hashed.
DATA lt_makt TYPE HASHED TABLE OF makt WITH UNIQUE KEY matnr.
DATA ls_makt TYPE makt.
LOOP AT gt_table ASSIGNING <wa_table>.
READ TABLE lt_makt INTO ls_makt WITH TABLE KEY matnr = <wa_table>-matnr.
IF sy-subrc <> 0.
ls_makt-matnr = <wa_table>-matnr.
PERFORM get_maktx USING ls_makt-matnr CHANGING ls_makt-maktx.
IF sy-subrc <> 0.
CLEAR ls_makt-maktx.
ENDIF.
INSERT ls_makt INTO TABLE lt_makt.
ENDIF.
<wa_table>-maktx = ls_makt-maktx.
ENDLOOP.
ENDFORM. "fill_maktx_test_hashed
Случай с ЕИ скорее исключение из правил. В моих отчетах, заказчик хочет видеть: наименования БЕ, заводов, групп материалов, материалов, складов, счетов, контрагентов, подразделений, и т.п. Во всех отчетах с 1000+ строк лучший результат по времени давала хэш-таблица.