Thursday 18 July 2019

Performance READ TABLE with Secondary Table Key Vs Binary Search


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.

DATAlv_sta_time TYPE timestampl,
      lv_end_time 
TYPE timestampl,
      lv_diff_w   
TYPE 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 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_wlv_end_timelv_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_wlv_end_timelv_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.

DATAlv_sta_time TYPE timestampl,
      lv_end_time 
TYPE timestampl,
      lv_diff_w   
TYPE 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 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_wlv_end_timelv_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_wlv_end_timelv_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