๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

SAP

์  ์ŠคํŒŒํฌ๋ฅผ ํ™œ์šฉํ•œ ์„ฑ๋Šฅ๊ฐœ์„  - ์ ์šฉ ์ „

๋ฐ˜์‘ํ˜•

๐ŸŽ‰ ์ข‹์€ ์†Œ์‹: ์ฃผ์š” ๊ฐœ์„ ์ด ์ด๋ฏธ ์ ์šฉ๋จ!

์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ 2025.10.29์— ์ด๋ฏธ ์ตœ์ ํ™” ์ž‘์—…์ด ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

"*<<Start>>**********************************************************
"S/4HANA2025.10.29 KOLON12 CTS: DEVK900802
":LT_SKAT ํ…Œ์ด๋ธ”์„ HASHED TABLE๋กœ ์„ ์–ธ
"**********************************************************************
DATA : LT_SKAT TYPE HASHED TABLE OF SKAT
               WITH UNIQUE KEY SPRAS KTOPL SAKNR
               WITH HEADER LINE.

โœ… ์ด๋ฏธ ์ ์šฉ๋œ ๊ฐœ์„ :

  • SKAT ํ…Œ์ด๋ธ” → HASHED TABLE ์ „ํ™˜
  • SELECT SINGLE → READ TABLE ๋ณ€๊ฒฝ
  • FOR ALL ENTRIES๋กœ ์‚ฌ์ „ ๋Œ€๋Ÿ‰ ์กฐํšŒ

๐Ÿ” ST12 Trace ๋ถ„์„ (ํ˜„์žฌ ์ƒํƒœ)

์ „์ฒด ์‹คํ–‰ ์‹œ๊ฐ„

ํ•ญ๋ชฉ์‹œ๊ฐ„ (μs)๋น„์œจ
์ด ์‹คํ–‰ ์‹œ๊ฐ„ 516,381,073 100%
ABAP 515,937,391 99.9%
Database 428,359 0.1%
System 15,323 0.0%

ํ•ต์‹ฌ ๋ณ‘๋ชฉ ์ง€์ 

์ˆœ์œ„ํ•ญ๋ชฉํ˜ธ์ถœ ํšŸ์ˆ˜์‹คํ–‰ ์‹œ๊ฐ„ (μs)๋น„์œจ๋ฌธ์ œ์ 
1์œ„ READ TABLE GT_ZFIT8053 481,931ํšŒ 503,544,703 97.5% ๐Ÿ”ด ์ตœ๋Œ€ ๋ณ‘๋ชฉ
2์œ„ LOOP AT LT_ZFIT8050 481,931ํšŒ 514,983,945 99.7% ์ „์ฒด LOOP
3์œ„ READ TABLE GT_ZFIT8051 481,931ํšŒ 3,089,810 0.6% ์–‘ํ˜ธ
4์œ„ READ TABLE LT_SKAT 481,931ํšŒ 1,149,331 0.2% โœ… ๊ฐœ์„ ๋จ

ํ•ต์‹ฌ ๋ฐœ๊ฒฌ:

  • โœ… LT_SKAT์€ ์ด๋ฏธ ์ตœ์ ํ™”๋จ (0.2%๋งŒ ์ฐจ์ง€)
  • ๐Ÿ”ด GT_ZFIT8053์ด 97.5% ์ฐจ์ง€ - ์—ฌ๊ธฐ๊ฐ€ ๋ฌธ์ œ!

๐Ÿš€ ์ถ”๊ฐ€ ์ตœ์ ํ™” ๋ฐฉ์•ˆ

์ตœ์šฐ์„ : GT_ZFIT8053์„ HASHED TABLE๋กœ ์ „ํ™˜

โŒ ํ˜„์žฌ ์ฝ”๋“œ (์ตœ๋Œ€ ๋ณ‘๋ชฉ)

" GET_DATA FORM ๋‚ด๋ถ€
LOOP AT LT_ZFIT8050.  " 481,931๋ฒˆ ๋ฐ˜๋ณต

  " โ˜…โ˜…โ˜… ์ตœ๋Œ€ ๋ณ‘๋ชฉ: 481,931๋ฒˆ × ์„ ํ˜• ๊ฒ€์ƒ‰ = 97.5% ์‹œ๊ฐ„ ์†Œ๋น„ โ˜…โ˜…โ˜…
  READ TABLE GT_ZFIT8053 WITH KEY GJAHR = LT_ZFIT8050-GJAHR
                                  BELNR = LT_ZFIT8050-BELNR.
  
  IF SY-SUBRC = 0.
    LT_ZFIT8050-SAKNR_D = GT_ZFIT8053-SAKNR.
  ENDIF.
  
ENDLOOP.

๋ฌธ์ œ์ :

  • GT_ZFIT8053์— ์ธ๋ฑ์Šค ์—†์Œ
  • 481,931ํšŒ × ํ‰๊ท  1,045μs = 503์ดˆ ์†Œ์š”
  • ์ „์ฒด ์‹œ๊ฐ„์˜ 97.5% ์ฐจ์ง€

โœ… ๊ฐœ์„  ์ฝ”๋“œ (HASHED TABLE ์‚ฌ์šฉ)

*&---------------------------------------------------------------------*
*& FORM GET_MASTER_DATA - GT_ZFIT8053 ์ตœ์ ํ™”
*&---------------------------------------------------------------------*
FORM GET_MASTER_DATA.

"*<<Start>>**********************************************************
"S/4HANA2025.10.29 KOLON12 ์ถ”๊ฐ€ ์ตœ์ ํ™”
":GT_ZFIT8053์„ HASHED TABLE๋กœ ์ „ํ™˜
"**********************************************************************

  " โ˜… HASHED TABLE ํƒ€์ž… ์ •์˜
  TYPES: BEGIN OF ty_zfit8053_hash,
           gjahr TYPE zfit8053-gjahr,
           belnr TYPE zfit8053-belnr,
           saknr TYPE zfit8053-saknr,
         END OF ty_zfit8053_hash.

  " โ˜… HASHED TABLE๋กœ ์„ ์–ธ (O(1) ์กฐํšŒ ์†๋„)
  DATA: gt_zfit8053_hash TYPE HASHED TABLE OF ty_zfit8053_hash
                         WITH UNIQUE KEY gjahr belnr.

  " ๊ธฐ์กด ํ…Œ์ด๋ธ” ์กฐํšŒ
  SELECT gjahr belnr saknr
    INTO CORRESPONDING FIELDS OF TABLE @gt_zfit8053_hash
    FROM zfit8053.

  " ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๊ธฐ์กด GT_ZFIT8053๋„ ์œ ์ง€ (๋‹ค๋ฅธ ๊ณณ์—์„œ ์‚ฌ์šฉ ์‹œ)
  SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_ZFIT8051
           FROM ZFIT8051.

"*<< End >>************************************************************

ENDFORM.


*&---------------------------------------------------------------------*
*& FORM GET_DATA - GT_ZFIT8053 ์กฐํšŒ ์ตœ์ ํ™”
*&---------------------------------------------------------------------*
FORM GET_DATA.

  DATA: ls_zfit8053_hash TYPE ty_zfit8053_hash.

  " ... (๊ธฐ์กด ์ฝ”๋“œ)

"*<<Start>>**********************************************************
"S/4HANA2025.10.29 KOLON12 ์ถ”๊ฐ€ ์ตœ์ ํ™”
":GT_ZFIT8053 ์กฐํšŒ๋ฅผ HASHED TABLE๋กœ ๋ณ€๊ฒฝ
"**********************************************************************

  LOOP AT LT_ZFIT8050.

    " AS-IS: ์„ ํ˜• ๊ฒ€์ƒ‰ (๋А๋ฆผ)
    " READ TABLE GT_ZFIT8053 WITH KEY GJAHR = LT_ZFIT8050-GJAHR
    "                                 BELNR = LT_ZFIT8050-BELNR.

    " โ˜… TO-BE: ํ•ด์‹œ ๊ฒ€์ƒ‰ (O(1) - ์ฆ‰์‹œ ์กฐํšŒ)
    READ TABLE gt_zfit8053_hash INTO ls_zfit8053_hash
      WITH TABLE KEY gjahr = lt_zfit8050-gjahr
                     belnr = lt_zfit8050-belnr.

    IF sy-subrc = 0.
      lt_zfit8050-saknr_d = ls_zfit8053_hash-saknr.
    ENDIF.

"*<< End >>************************************************************

    " ์•„์ด์ฝ˜ ์„ค์ •
    ASSIGN COMPONENT 'ICON' OF STRUCTURE <gs_outt> TO <field>.
    IF lt_zfit8050-saknr_d IS INITIAL.
      <field> = icon_led_red.
    ELSE.
      <field> = icon_led_green.
    ENDIF.

    " ... (๋‚˜๋จธ์ง€ ์ฝ”๋“œ)

  ENDLOOP.

ENDFORM.

์˜ˆ์ƒ ํšจ๊ณผ:

  • 503์ดˆ → 5์ดˆ (99% ๊ฐ์†Œ)
  • ์ „์ฒด 516์ดˆ → 18์ดˆ (96.5% ๊ฐœ์„ )

์ถ”๊ฐ€ ์ตœ์ ํ™”: GT_ZFIT8051๋„ HASHED TABLE๋กœ

FORM GET_MASTER_DATA.

  " GT_ZFIT8051๋„ HASHED TABLE๋กœ ์ „ํ™˜
  TYPES: BEGIN OF ty_zfit8051_hash,
           saknr  TYPE zfit8051-saknr,
           gubun  TYPE zfit8051-gubun,
           level1 TYPE zfit8051-level1,
           level2 TYPE zfit8051-level2,
           level3 TYPE zfit8051-level3,
           level4 TYPE zfit8051-level4,
           level5 TYPE zfit8051-level5,
         END OF ty_zfit8051_hash.

  DATA: gt_zfit8051_hash TYPE HASHED TABLE OF ty_zfit8051_hash
                         WITH UNIQUE KEY saknr gubun.

  SELECT saknr gubun level1 level2 level3 level4 level5
    INTO CORRESPONDING FIELDS OF TABLE @gt_zfit8051_hash
    FROM zfit8051.

ENDFORM.


FORM GET_DATA.

  DATA: ls_zfit8051_hash TYPE ty_zfit8051_hash.

  LOOP AT lt_zfit8050.
    
    " ... (GT_ZFIT8053 ์กฐํšŒ)

    " ๊ตฌ๋ถ„ ๊ฒฐ์ •
    CLEAR lv_gubun.
    IF lt_zfit8050-dmbtr > 0.
      lv_gubun = 'D'.
    ELSE.
      lv_gubun = 'W'.
    ENDIF.

    " AS-IS
    " READ TABLE GT_ZFIT8051 WITH KEY SAKNR = LT_ZFIT8050-SAKNR_D
    "                                 GUBUN = LV_GUBUN.

    " TO-BE: HASHED TABLE ์กฐํšŒ
    READ TABLE gt_zfit8051_hash INTO ls_zfit8051_hash
      WITH TABLE KEY saknr = lt_zfit8050-saknr_d
                     gubun = lv_gubun.

    IF sy-subrc = 0.
      " LEVEL ํ•„๋“œ ๋งคํ•‘
      ASSIGN COMPONENT 'LEVEL1' OF STRUCTURE <gs_outt> TO <field>.
      <field> = COND #( WHEN ls_zfit8051_hash-level1 = ''
                        THEN '2.'
                        WHEN ls_zfit8051_hash-level1 = ''
                        THEN '3.'
                        ELSE ls_zfit8051_hash-level1 ).
      
      ASSIGN COMPONENT 'LEVEL2' OF STRUCTURE <gs_outt> TO <field>.
      <field> = ls_zfit8051_hash-level2.
      
      " ... (LEVEL3~5๋„ ๋™์ผ)
    ELSE.
      " ๊ธฐ๋ณธ๊ฐ’ ์ฒ˜๋ฆฌ
    ENDIF.

  ENDLOOP.

ENDFORM.

์ถ”๊ฐ€ ์˜ˆ์ƒ ํšจ๊ณผ: 3์ดˆ → 0.1์ดˆ (3์ดˆ ์ถ”๊ฐ€ ๊ฐœ์„ )


๐Ÿ“Š ์ตœ์ข… ๊ฐœ์„  ํšจ๊ณผ ์˜ˆ์ƒ

ํ•ญ๋ชฉํ˜„์žฌ (์ดˆ)๊ฐœ์„  ํ›„ (์ดˆ)๊ฐœ์„ ์œจ
READ TABLE GT_ZFIT8053 503.5 5 99.0% ↓
READ TABLE GT_ZFIT8051 3.1 0.1 96.8% ↓
READ TABLE LT_SKAT 1.1 1.1 ์ด๋ฏธ ์ตœ์ ํ™”๋จ โœ…
๊ธฐํƒ€ ์ฒ˜๋ฆฌ 8.7 7 19.5% ↓
์ด ์‹คํ–‰ ์‹œ๊ฐ„ 516 13 97.5% ↓

์ตœ์ข… ์˜ˆ์ƒ: 8๋ถ„ 36์ดˆ → 13์ดˆ โšก


๐ŸŽฏ ์ ์šฉ ๊ฐ€์ด๋“œ

1๋‹จ๊ณ„: ๋ฐฑ์—… (ํ•„์ˆ˜)

" ๊ธฐ์กด ํ”„๋กœ๊ทธ๋žจ ๋ณต์‚ฌ (SE38)
Program: ZCO0810 → ZCO0810_BACKUP_20251029

2๋‹จ๊ณ„: GET_MASTER_DATA ์ˆ˜์ •

FORM GET_MASTER_DATA.

  " 1. GT_ZFIT8053 HASHED TABLE ์ถ”๊ฐ€
  TYPES: BEGIN OF ty_zfit8053_hash,
           gjahr TYPE zfit8053-gjahr,
           belnr TYPE zfit8053-belnr,
           saknr TYPE zfit8053-saknr,
         END OF ty_zfit8053_hash.

  DATA: gt_zfit8053_hash TYPE HASHED TABLE OF ty_zfit8053_hash
                         WITH UNIQUE KEY gjahr belnr.

  SELECT gjahr belnr saknr
    INTO CORRESPONDING FIELDS OF TABLE @gt_zfit8053_hash
    FROM zfit8053.

  " 2. GT_ZFIT8051 HASHED TABLE ์ถ”๊ฐ€
  TYPES: BEGIN OF ty_zfit8051_hash,
           saknr  TYPE zfit8051-saknr,
           gubun  TYPE zfit8051-gubun,
           level1 TYPE zfit8051-level1,
           level2 TYPE zfit8051-level2,
           level3 TYPE zfit8051-level3,
           level4 TYPE zfit8051-level4,
           level5 TYPE zfit8051-level5,
         END OF ty_zfit8051_hash.

  DATA: gt_zfit8051_hash TYPE HASHED TABLE OF ty_zfit8051_hash
                         WITH UNIQUE KEY saknr gubun.

  SELECT saknr gubun level1 level2 level3 level4 level5
    INTO CORRESPONDING FIELDS OF TABLE @gt_zfit8051_hash
    FROM zfit8051.

ENDFORM.

3๋‹จ๊ณ„: GET_DATA ์ˆ˜์ •

LOOP ๋‚ด๋ถ€์˜ READ TABLE ๊ตฌ๋ฌธ์„ WITH TABLE KEY๋กœ ๋ณ€๊ฒฝ:

" ๋ณ€๊ฒฝ ์ „
READ TABLE GT_ZFIT8053 WITH KEY GJAHR = ...

" ๋ณ€๊ฒฝ ํ›„
READ TABLE gt_zfit8053_hash INTO ls_zfit8053_hash
  WITH TABLE KEY gjahr = ... belnr = ...

4๋‹จ๊ณ„: ํ…Œ์ŠคํŠธ

  1. ๊ฐœ๋ฐœ ์‹œ์Šคํ…œ์—์„œ ํ…Œ์ŠคํŠธ
  2. ST12 Trace ์žฌ์‹คํ–‰ → ๊ฐœ์„  ํ™•์ธ
  3. ๊ฒฐ๊ณผ ๋น„๊ต: 516์ดˆ → 13์ดˆ ํ™•์ธ
  4. ํ’ˆ์งˆ ์‹œ์Šคํ…œ ์ด๊ด€

๐Ÿ’ก ์ถ”๊ฐ€ ํŒ

A. FIELD-SYMBOL ์‚ฌ์šฉ์œผ๋กœ ์ถ”๊ฐ€ ๊ฐœ์„ 

" ๋ณ€๊ฒฝ ์ „
LOOP AT lt_zfit8050.
  " ๋งค๋ฒˆ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ
ENDLOOP.

" ๋ณ€๊ฒฝ ํ›„
LOOP AT lt_zfit8050 ASSIGNING FIELD-SYMBOL(<fs_8050>).
  " ์ฐธ์กฐ๋งŒ ์‚ฌ์šฉ (๋ณต์‚ฌ ์—†์Œ)
  READ TABLE gt_zfit8053_hash INTO DATA(ls_8053)
    WITH TABLE KEY gjahr = <fs_8050>-gjahr
                   belnr = <fs_8050>-belnr.
ENDLOOP.

B. ์ค‘๋ณต ์ œ๊ฑฐ ๋กœ์ง ๊ฐœ์„ 

ํ˜„์žฌ ์ฝ”๋“œ์— ์ด๋ฏธ ์žˆ๋Š” ์ค‘๋ณต ์ œ๊ฑฐ๋Š” ์ข‹์Šต๋‹ˆ๋‹ค:

SORT LT_ZFIT8050 BY GJAHR BELNR SAKNR SAKNR_D.
DELETE ADJACENT DUPLICATES FROM LT_ZFIT8050.  " โœ… ์ข‹์Œ

๐Ÿšจ ์ฃผ์˜์‚ฌํ•ญ

  1. ๊ธฐ์กด GT_ZFIT8053/GT_ZFIT8051 ์œ ์ง€
    • ๋‹ค๋ฅธ FORM์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ญ์ œํ•˜์ง€ ๋ง ๊ฒƒ
    • ์ƒˆ๋กœ์šด HASHED TABLE์€ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑ
  2. WITH TABLE KEY vs WITH KEY
    • โŒ WITH KEY: ์„ ํ˜• ๊ฒ€์ƒ‰ (๋А๋ฆผ)
    • โœ… WITH TABLE KEY: ํ•ด์‹œ ๊ฒ€์ƒ‰ (๋น ๋ฆ„)
  3. ํ…Œ์ŠคํŠธ ํ•„์ˆ˜
    • ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ํ™•์ธ
    • ๊ฒฐ๊ณผ ๋น„๊ต (๊ฐœ์„  ์ „/ํ›„)

๐Ÿ“‹ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

โ–ก 1. ๋ฐฑ์—… ์™„๋ฃŒ
โ–ก 2. GET_MASTER_DATA์— HASHED TABLE ์ถ”๊ฐ€
โ–ก 3. GET_DATA์˜ READ TABLE ๊ตฌ๋ฌธ ๋ณ€๊ฒฝ
โ–ก 4. Syntax Check ํ†ต๊ณผ
โ–ก 5. ๊ฐœ๋ฐœ ์‹œ์Šคํ…œ ํ…Œ์ŠคํŠธ
โ–ก 6. ST12 Trace๋กœ ์„ฑ๋Šฅ ํ™•์ธ (516์ดˆ → 13์ดˆ)
โ–ก 7. ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ (๊ฒฐ๊ณผ ๋™์ผ ํ™•์ธ)
โ–ก 8. ์ด๊ด€ ์š”์ฒญ

์ด๋ฏธ SKAT ์ตœ์ ํ™”๋ฅผ ํ•˜์…จ์œผ๋‹ˆ, GT_ZFIT8053๋งŒ ์ถ”๊ฐ€๋กœ ์ตœ์ ํ™”ํ•˜๋ฉด 97.5% ๊ฐœ์„ (8๋ถ„ 36์ดˆ → 13์ดˆ)์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค!

๋ฐ˜์‘ํ˜•