User Exits
ABAP DevelopmentAdvanced

Performance Risks in User Exits

Avoid transaction slowdowns caused by heavy logic inside save exits.

Explanation

User exits often run during critical transactions such as sales order save, delivery save or billing creation. A small performance mistake can affect many users. SELECT inside LOOP, repeated configuration reads, broad selects and synchronous RFC calls are common problems. If item-level data needs enrichment, collect unique keys first, select data once and use hashed or sorted internal tables for lookup. Performance should be tested with realistic orders, deliveries or billing documents, not just one small test document.

Code example

ABAP Code
* Bad pattern:* SELECT inside item loop during sales order save.* This can make VA01/VA02 slow for large orders. LOOP AT xvbap ASSIGNING FIELD-SYMBOL(<ls_item>).   SELECT SINGLE mtart    FROM mara    INTO @DATA(lv_mtart)    WHERE matnr = @<ls_item>-matnr. ENDLOOP. * Better pattern:* Build unique material list, read once, then use lookup. DATA lt_matnr TYPE SORTED TABLE OF matnr WITH UNIQUE KEY table_line. LOOP AT xvbap ASSIGNING <ls_item>.  INSERT <ls_item>-matnr INTO TABLE lt_matnr.ENDLOOP. IF lt_matnr IS NOT INITIAL.  SELECT matnr, mtart    FROM mara    INTO TABLE @DATA(lt_mara)    FOR ALL ENTRIES IN @lt_matnr    WHERE matnr = @lt_matnr-table_line.ENDIF. DATA lt_mara_hash TYPE HASHED TABLE OF mara WITH UNIQUE KEY matnr.lt_mara_hash = CORRESPONDING #( lt_mara ).

Real project scenario

A sales order exit reads MARA for every item. Large orders become slow. The fix is to collect unique materials, read MARA once and use hashed table lookup.

Common mistakes

- SELECT inside item loop. - Calling slow RFC during save. - Reading the same config repeatedly. - Testing only small data volume.

Best practices

- Avoid repeated database reads. - Use driver tables. - Use hashed lookup. - Measure with realistic volume. - Keep save exits fast.

Interview angle

A strong answer should mention critical save flow, repeated execution and preload/lookup optimization.