본문 바로가기

Ⅰ. ERP/1. ABAP

[SAP ABAP] 효율적인 코딩법(튜닝)

728x90

[SQL 함수 사용하기]

SELECT구문에서 LOOP를 돌면서 처리하는 형태의 합, 평균을 구하는 방법을 SQL 함수를 이용하여 개선하는 예이다.

 

DATA : BEGIN OF vbqty OCCURS 0.
matnr LIKE vbap-matnr,
kwmeng LIKE vbap-kwment,
meins LIKE vbap-meins.

*-- 개선 전.
SELECT matnr kwmeng meins INTO vbqty FROM vbap WHERE .
COLLECT vbqty.
ENDSELECT.

*----------------------------------------------------------------------*
*-- 개선 후.
SELECT matnr SUM ( kwmeng ) meins INTO TABLE vbqty
FROM vbap WHERE …
GROUP BY matnr meins.

 

10,000건의 데이터를 처리하였을 경우, 아래와 같은 성능 차이가 나왔다.

개선 전: 2,370,000 microseconds

개선 후: 1,574,000 microseconds

GROUP BY 절은 Pool Table이나 Cluster Table에는 사용될 수 없다(BSEG, VBFA).

 

[효과적인 Internal Table 작업]

Nested LOOP 처리

Nested LOOP는 BINARY SEARCH를 이용하여 아래와 같이 개선할 수 있다.

 

DATA : ivbak LIKE VBAK OCCURS 0,
Ivbap LIKE VBAP OCCURS 0.

SORT : ivbaK BY vebln, ivbap BY vbeln.

*-- 개선 전.
LOOP AT ivbak.
LOOP AT ivbap WHERE vbeln = ivbak-vbeln.
WRITE : / 
ENDLOOP.
ENDLOOP.

*-- 개선 후.
LOOP AT ivbak.
“Work Area에 아무 값도 넘기지 않음. Sy-subrc, sy-tabix를 설정하기 위함.
READ TABLE ivbap WITH KEY vbeln = ivbak-vbeln
BINARY SEARCH TRASPORTING NO FIELDS.

LOOP AT ivbap FROM sy-tabix.
IF ivbap-vbeln <> ivbak-vbeln. EXIT. ENDIF.
WRITE : / 
ENDLOOP.
ENDLOOP.

Ivbak : 5,000 ivbap : 20,000 일 때.

Nested LOOP with WHERE : 5분.

LOOP/READ BINARY SEARCH/LOOP : 15초.

 

[DML 구문 최적화]

효과적인 UPDATE 기법

SELECT 와 ENDSELECT 사이에서 순환을 하면서 UPDATE 하는 형태는 아래와 같이 WHERE 절을 이용하여 개선할 수 있다.

 

*-- 개선 전.
PARAMETES : pa_vkbur LIKE zvbak-vkbur.
SELECT-OPTIONS : so_vbeln FOR zvbak-vbeln.

SELECT * FROM zvbak WHERE vbeln IN so_vbeln.
zvbak-vkbur = pa_vkbur.
UPDATE zvbak.
EDNSELECT.

*----------------------------------------------------------------------*
*-- 개선 후.
UPDATE zvbak SET vkbur = pa_vkbur
WHERE vbeln IN so_vbeln.

IF sy-subrc = 0.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.

 

[효과적인 LOOP 처리]

Internal Table에서 특정 조건을 만족하는 데이터가 몇 건인지를 알고 싶은 경우에는 다음과 같이 한다.

LOOP AT it1 TRANSPORTING NO FIELDS
WHERE bname = smith .
ADD 1 TO counter.
ENDLOOP.

Internal Table에서특정 조건을 만족시키는 데이터가 있는지 알고 싶다면 아래와 같이 하라.

LOOP AT it1 TRANSPORTING NO FIELDS
WHERE vbeln > ‘003000000100 ’.
EXIT.
ENDLOOP.

 

[내부 테이블 간 데이터 복사]

동일한 구조를 가지는 두 개의 내부 테이블 간에 서로 데이터를 복사하고자 할 경우 아래와 같이 한다.

 

DATA : it1 LIKE eban OCCURS 100 WITH HEADER LINE,
It2 LIKE eban OCCURS 100 WITH HEADER LINE.
*-- 개선 전.
REFRESH it2.
LOOP AT it1.
MOVE it1 TO it2.
APPEND it2.
ENDLOOP.

*-- 개선 후.
It2[] = it1[].

 

[내부 테이블의 데이터 APPEND]

동일한 구조를 가지는 두 개의 내부 테이블간에 서로 데이터를 APPEND 하고자 할 경우에는 아래와 같이 개선한다.

DATA : it1 LIKE eban OCCURS 100 WITH HEADER LINE,
It2 LIKE eban OCCURS 100 WITH HEADER LINE.
*-- 개선 전.
LOOP AT it1.
MOVE it1 TO it2.
APPEND it2.
ENDLOOP.

*-- 개선 후.
APPEND LINES OF it1 TO it2.

 

[내부 테이블의 중복 데이터 삭제] - 많이 사용됨

DELETE ADJACENT DUPLICATES FROM itab [COMPARING field1 field2 …].

위 방법을 사용하기 위해서는 비교조건 필드를 기준으로 정렬되어 있어야 한다.

비교조건이 없다면, 모든 필드로 정렬되어 있어야 한다.

 

 

내부 테이블 데이터 개수 알아내기

DESCRIBE TABLE itab LINES n.

n = lines ( itab ).
DESCRIBE TABLE itab [LINES lin] [OCCURS n] [KIND knd].

인터널 테이블의 속성을 알고자 할 경우 사용하는 것

LINES       | 인터널 테이블의 라인수를 리턴 

OCCURS  | 인터널 테이블의 초기 SIZE를 리턴

KIND         | 인터널 테이블의 종류를 리턴

                   'T' for standard table

                   'S' for sorted table

                   'H' for hashed table 

 

 

[도메인 값 얻어오기]

SELECT SINGLE ddtext FROM dd07v
INTO p_text CHAR 60
WHERE domname = p_domain 도메인 이름
AND domvalue_l = p_value 도메인 값
AND ddlanguage = sy-langu.

 

[통화키 얻어오기]

SELECT SINGLE ktext
FROM tcurt
INTO p_waerstxt
WHERE waers = p_waers AND spras = sy-langu.

[내부 테이블을 파일로 다운 받고 파일 열기]

call function ' DOWNLOAD '
exporting
filename = filename
filetype = filetype
mode = mode
importing
act_filename = act_filename
tables
data_tab = down_itab.

call function ' WS_EXECUTE '
exporting
program = act_filename
inform = ''
exceptions
prog_not_found.

[Data Type - RFC Destination]

DATA : rfcdest LIKE rfcdisplay-rfcdest.

 

Transaction Code

AbapDocu: ABAP 프로그래밍 예제.

Search_sap_menu: 메뉴 찾기.

ST05 :시스템 유틸리티 성능 추적.

STMS: CTS 관리자 .

SE09: CTS 요청.

SE30: 프로그램, 함수 성능 검사.

SQ01: ABAP QUERY.

SM50: 실행 중인 프로그램 목록 보기 .

SU01: 사용자 등록정보(암호 변경 가능) 바꾸기.

ST22: Dump 조회.

AL11: 서버 폴더 목록

 

 

참고 : https://m.blog.naver.com/PostView.nhn?blogId=weblogic1&logNo=30052719398&proxyReferer=http:%2F%2Fwww.google.com%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3D%26esrc%3Ds%26source%3Dweb%26cd%3D7%26ved%3D2ahUKEwiUgt75rsvnAhUQ_GEKHSWrBcEQFjAGegQIARAB%26url%3Dhttp%253A%252F%252Fm.blog.naver.com%252Fweblogic1%252F30052719398%26usg%3DAOvVaw3LAxW3sBYcDOGXCDieqrgu

728x90