Secondary Table key
Access to an internal table using a secondary key is always
optimized. This allows additional optimized keys to be introduced for sorted
and hashed tables as well as optimized key accesses for standard tables.
- With Unique Sorted Key – Immediate update. Table key will be up to date
- With Non-Unique Sorted Key – Lazy update. Key will be update after first table access. Accessing same record 2nd time is more faster.
Binary Search
- We are using Binary search Instead linear search. Need to sort internal table before read
Secondary Table key (WITH UNIQUE SORTED KEY) Vs Binary Search
REPORT zperformance_test_uk.
DATA: lv_sta_time TYPE timestampl,
lv_end_time TYPE timestampl,
lv_diff_w TYPE p DECIMALS 5,
lv_diff_f LIKE lv_diff_w.
PARAMETERS : p_count TYPE c LENGTH 10 OBLIGATORY.
START-OF-SELECTION.
TYPES : BEGIN OF ty_vbrp,
vbeln TYPE vbrp-vbeln,
posnr TYPE vbrp-posnr,
matnr TYPE vbrp-matnr,
END OF ty_vbrp.
DATA : lt_vbrp TYPE STANDARD TABLE OF ty_vbrp.
TYPES : BEGIN OF ty_mara,
matnr TYPE vbrp-matnr,
END OF ty_mara.
DATA : lt_mara TYPE STANDARD TABLE OF ty_mara,
lt_mara_sec_key TYPE STANDARD TABLE OF ty_mara WITH UNIQUE SORTED KEY by_matnr COMPONENTS matnr.
SELECT vbeln
posnr
matnr
FROM vbrp
INTO TABLE lt_vbrp
UP TO p_count ROWS.
IF lt_vbrp[] IS NOT INITIAL.
SELECT matnr
FROM mara
INTO TABLE lt_mara.
* Removed FOR ALL ENTRIES IN to get more data
* FOR ALL ENTRIES IN lt_vbrp
* WHERE matnr = lt_vbrp-matnr.
lt_mara_sec_key = lt_mara.
ENDIF.
WRITE: /(50) 'WITH UNIQUE SORTED KEY'.
DO 5 TIMES.
GET TIME STAMP FIELD lv_sta_time.
LOOP AT lt_vbrp ASSIGNING FIELD-SYMBOL(<fs_vbrp>).
READ TABLE lt_mara_sec_key TRANSPORTING NO FIELDS WITH TABLE KEY by_matnr COMPONENTS matnr = <fs_vbrp>-matnr.
ENDLOOP.
GET TIME STAMP FIELD lv_end_time.
lv_diff_w = lv_end_time - lv_sta_time.
WRITE: /(30) 'Secondary Key', lv_diff_w.
CLEAR : lv_diff_w, lv_end_time, lv_sta_time.
*******************************************************************************************************************
GET TIME STAMP FIELD lv_sta_time.
SORT lt_mara ASCENDING BY matnr.
LOOP AT lt_vbrp ASSIGNING <fs_vbrp>.
READ TABLE lt_mara TRANSPORTING NO FIELDS WITH KEY matnr = <fs_vbrp>-matnr
BINARY SEARCH.
ENDLOOP.
GET TIME STAMP FIELD lv_end_time.
lv_diff_w = lv_end_time - lv_sta_time.
WRITE: /(30) 'Binary Search', lv_diff_w.
CLEAR : lv_diff_w, lv_end_time, lv_sta_time.
WRITE: /(30) '----------------------------'.
ENDDO.
DATA: lv_sta_time TYPE timestampl,
lv_end_time TYPE timestampl,
lv_diff_w TYPE p DECIMALS 5,
lv_diff_f LIKE lv_diff_w.
PARAMETERS : p_count TYPE c LENGTH 10 OBLIGATORY.
START-OF-SELECTION.
TYPES : BEGIN OF ty_vbrp,
vbeln TYPE vbrp-vbeln,
posnr TYPE vbrp-posnr,
matnr TYPE vbrp-matnr,
END OF ty_vbrp.
DATA : lt_vbrp TYPE STANDARD TABLE OF ty_vbrp.
TYPES : BEGIN OF ty_mara,
matnr TYPE vbrp-matnr,
END OF ty_mara.
DATA : lt_mara TYPE STANDARD TABLE OF ty_mara,
lt_mara_sec_key TYPE STANDARD TABLE OF ty_mara WITH UNIQUE SORTED KEY by_matnr COMPONENTS matnr.
SELECT vbeln
posnr
matnr
FROM vbrp
INTO TABLE lt_vbrp
UP TO p_count ROWS.
IF lt_vbrp[] IS NOT INITIAL.
SELECT matnr
FROM mara
INTO TABLE lt_mara.
* Removed FOR ALL ENTRIES IN to get more data
* FOR ALL ENTRIES IN lt_vbrp
* WHERE matnr = lt_vbrp-matnr.
lt_mara_sec_key = lt_mara.
ENDIF.
WRITE: /(50) 'WITH UNIQUE SORTED KEY'.
DO 5 TIMES.
GET TIME STAMP FIELD lv_sta_time.
LOOP AT lt_vbrp ASSIGNING FIELD-SYMBOL(<fs_vbrp>).
READ TABLE lt_mara_sec_key TRANSPORTING NO FIELDS WITH TABLE KEY by_matnr COMPONENTS matnr = <fs_vbrp>-matnr.
ENDLOOP.
GET TIME STAMP FIELD lv_end_time.
lv_diff_w = lv_end_time - lv_sta_time.
WRITE: /(30) 'Secondary Key', lv_diff_w.
CLEAR : lv_diff_w, lv_end_time, lv_sta_time.
*******************************************************************************************************************
GET TIME STAMP FIELD lv_sta_time.
SORT lt_mara ASCENDING BY matnr.
LOOP AT lt_vbrp ASSIGNING <fs_vbrp>.
READ TABLE lt_mara TRANSPORTING NO FIELDS WITH KEY matnr = <fs_vbrp>-matnr
BINARY SEARCH.
ENDLOOP.
GET TIME STAMP FIELD lv_end_time.
lv_diff_w = lv_end_time - lv_sta_time.
WRITE: /(30) 'Binary Search', lv_diff_w.
CLEAR : lv_diff_w, lv_end_time, lv_sta_time.
WRITE: /(30) '----------------------------'.
ENDDO.
Results:
Immediate update.
Table Secondary key is faster
Secondary Table key (WITH NON-UNIQUE SORTED KEY) Vs Binary Search
REPORT zperformance_test_uk.
DATA: lv_sta_time TYPE timestampl,
lv_end_time TYPE timestampl,
lv_diff_w TYPE p DECIMALS 5,
lv_diff_f LIKE lv_diff_w.
PARAMETERS : p_count TYPE c LENGTH 10 OBLIGATORY.
START-OF-SELECTION.
TYPES : BEGIN OF ty_vbrp,
vbeln TYPE vbrp-vbeln,
posnr TYPE vbrp-posnr,
matnr TYPE vbrp-matnr,
END OF ty_vbrp.
DATA : lt_vbrp TYPE STANDARD TABLE OF ty_vbrp.
TYPES : BEGIN OF ty_mara,
matnr TYPE vbrp-matnr,
END OF ty_mara.
DATA : lt_mara TYPE STANDARD TABLE OF ty_mara,
lt_mara_sec_key TYPE STANDARD TABLE OF ty_mara WITH NON-UNIQUE SORTED KEY by_matnr COMPONENTS matnr.
SELECT vbeln
posnr
matnr
FROM vbrp
INTO TABLE lt_vbrp
UP TO p_count ROWS.
IF lt_vbrp[] IS NOT INITIAL.
SELECT matnr
FROM mara
INTO TABLE lt_mara.
* Removed FOR ALL ENTRIES IN to get more data
* FOR ALL ENTRIES IN lt_vbrp
* WHERE matnr = lt_vbrp-matnr.
lt_mara_sec_key = lt_mara.
ENDIF.
WRITE: /(50) 'WITH UNIQUE SORTED KEY'.
DO 5 TIMES.
GET TIME STAMP FIELD lv_sta_time.
LOOP AT lt_vbrp ASSIGNING FIELD-SYMBOL(<fs_vbrp>).
READ TABLE lt_mara_sec_key TRANSPORTING NO FIELDS WITH TABLE KEY by_matnr COMPONENTS matnr = <fs_vbrp>-matnr.
ENDLOOP.
GET TIME STAMP FIELD lv_end_time.
lv_diff_w = lv_end_time - lv_sta_time.
WRITE: /(30) 'Secondary Key', lv_diff_w.
CLEAR : lv_diff_w, lv_end_time, lv_sta_time.
*******************************************************************************************************************
GET TIME STAMP FIELD lv_sta_time.
SORT lt_mara ASCENDING BY matnr.
LOOP AT lt_vbrp ASSIGNING <fs_vbrp>.
READ TABLE lt_mara TRANSPORTING NO FIELDS WITH KEY matnr = <fs_vbrp>-matnr
BINARY SEARCH.
ENDLOOP.
GET TIME STAMP FIELD lv_end_time.
lv_diff_w = lv_end_time - lv_sta_time.
WRITE: /(30) 'Binary Search', lv_diff_w.
CLEAR : lv_diff_w, lv_end_time, lv_sta_time.
WRITE: /(30) '----------------------------'.
ENDDO.
DATA: lv_sta_time TYPE timestampl,
lv_end_time TYPE timestampl,
lv_diff_w TYPE p DECIMALS 5,
lv_diff_f LIKE lv_diff_w.
PARAMETERS : p_count TYPE c LENGTH 10 OBLIGATORY.
START-OF-SELECTION.
TYPES : BEGIN OF ty_vbrp,
vbeln TYPE vbrp-vbeln,
posnr TYPE vbrp-posnr,
matnr TYPE vbrp-matnr,
END OF ty_vbrp.
DATA : lt_vbrp TYPE STANDARD TABLE OF ty_vbrp.
TYPES : BEGIN OF ty_mara,
matnr TYPE vbrp-matnr,
END OF ty_mara.
DATA : lt_mara TYPE STANDARD TABLE OF ty_mara,
lt_mara_sec_key TYPE STANDARD TABLE OF ty_mara WITH NON-UNIQUE SORTED KEY by_matnr COMPONENTS matnr.
SELECT vbeln
posnr
matnr
FROM vbrp
INTO TABLE lt_vbrp
UP TO p_count ROWS.
IF lt_vbrp[] IS NOT INITIAL.
SELECT matnr
FROM mara
INTO TABLE lt_mara.
* Removed FOR ALL ENTRIES IN to get more data
* FOR ALL ENTRIES IN lt_vbrp
* WHERE matnr = lt_vbrp-matnr.
lt_mara_sec_key = lt_mara.
ENDIF.
WRITE: /(50) 'WITH UNIQUE SORTED KEY'.
DO 5 TIMES.
GET TIME STAMP FIELD lv_sta_time.
LOOP AT lt_vbrp ASSIGNING FIELD-SYMBOL(<fs_vbrp>).
READ TABLE lt_mara_sec_key TRANSPORTING NO FIELDS WITH TABLE KEY by_matnr COMPONENTS matnr = <fs_vbrp>-matnr.
ENDLOOP.
GET TIME STAMP FIELD lv_end_time.
lv_diff_w = lv_end_time - lv_sta_time.
WRITE: /(30) 'Secondary Key', lv_diff_w.
CLEAR : lv_diff_w, lv_end_time, lv_sta_time.
*******************************************************************************************************************
GET TIME STAMP FIELD lv_sta_time.
SORT lt_mara ASCENDING BY matnr.
LOOP AT lt_vbrp ASSIGNING <fs_vbrp>.
READ TABLE lt_mara TRANSPORTING NO FIELDS WITH KEY matnr = <fs_vbrp>-matnr
BINARY SEARCH.
ENDLOOP.
GET TIME STAMP FIELD lv_end_time.
lv_diff_w = lv_end_time - lv_sta_time.
WRITE: /(30) 'Binary Search', lv_diff_w.
CLEAR : lv_diff_w, lv_end_time, lv_sta_time.
WRITE: /(30) '----------------------------'.
ENDDO.
Results
Secondary key is lazy
update. First time binary search faster. Second Onward time secondary key is
faster.
No comments:
Post a Comment