ABAP에서 쿼리문을 실행할 때 INDEX를 사용할 때의 실행시간과 INDEX를 사용하지 않았을 때의 실행시간은 엄청난 차이가 발생합니다. 테이블의 레코드 건수가 많아질수록 그 차이는 더욱 뚜렷해 집니다.
쿼리문의 WHERE절을 어떻게 사용하는냐에 따라 인덱스를 사용해서 돌아가기도 하고 그렇지 않기도 합니다.
이번 글에서는 ABAP에서 인덱스(Index) 사용의 효과를 간단한 예제를 통해 INDEX가 사용될 때와 INDEX가 사용되지 않을 때의 결과를 비교해 보고 WHERE절을 어떻게 사용하는 것이 좋은지 알아보겠습니다.
ABAP Dictionary에서 생성된 INDEX 확인하기
– 이미 생성된 INDEX를 확인하는 방법은 SE11(ABAP Dictionary)에서 확인 가능합니다.
※ 참고로 인덱스를 생성하는 방법은 ABAP Dictionary에서 테이블 인덱스(Index)를 생성하고 활성화 하는 방법 글을 참고하시기 바랍니다.
▼ 아래 화면은 BKPF 테이블에 대해 인덱스 ID “2“로 이미 인덱스가 만들어져 있는 것을 조회한 화면입니다.
인덱스 필드는 회사코드, 전표상태, 전표 전기일 이렇게 3개의 필드로 만들어진 인덱스임을 알 수 있습니다.
– BKPF 테이블에 만들어진 인덱스 중에 전표 전기일로 검색한다고 했을 때 전표전기일이 포함된 INDEX가 인덱스 ID “2” 입니다.
ABAP 실행에서 INDEX를 사용하지 않고 실행 한 경우
– 전기일만 WHERE 조건절에 지정해서 인덱스를 사용하지 못하고 실행된 예제 입니다.
PROGRAM YMM0001.
TABLES: BKPF.
DATA : F_TIME1 TYPE I,
F_TIME2 TYPE I,
F_RUNTIME TYPE I,
F_STARTTIME LIKE SY-UZEIT,
F_ENDTIME LIKE SY-UZEIT.
” 검색 조건 전기일
SELECT-OPTIONS SO_BUDAT FOR BKPF-BUDAT.
” ABAP 프로그램 실행시간을 가져오기 위해
SET RUN TIME CLOCK RESOLUTION LOW.
GET RUN TIME FIELD F_TIME1.
GET TIME FIELD F_STARTTIME.
*– 인덱스가 사용되도록 수정한 쿼리문
SELECT * FROM BKPF
WHERE BUDAT IN SO_BUDAT.
ENDSELECT.
GET RUN TIME FIELD F_TIME2.
GET TIME FIELD F_ENDTIME.
F_RUNTIME = F_TIME2 – F_TIME1.
“WRITE:/ F_STARTTIME, ‘~’, F_ENDTIME.
WRITE :/ ‘인덱스를 사용하지 않은 경우 = ‘, F_RUNTIME.
|
▼ 실행 결과 측정 화면입니다.
ABAP 실행에서 INDEX를 사용해서 실행 한 경우
– 인덱스를 사용할 수 있도록 BUKRS(회사코드)와 BSTAT(전표상태)를 WHERE절에 구문으로 추가해 주었습니다.
– 쿼리 실행 목적이 전기일의 모든 데이터를 가져오는 쿼리문이기에 회사코드와 전표상태는 모든 것을 포함하도록 전체 범위로 지정해 주면 됩니다.(순전히 INDEX를 사용하기 위한 목적으로 WHERE절에 추가함)
” ABAP 프로그램 실행시간을 가져오기 위해
SET RUN TIME CLOCK RESOLUTION LOW.
GET RUN TIME FIELD F_TIME1.
GET TIME FIELD F_STARTTIME.
*– 인덱스가 사용되도록 수정한 쿼리문
SELECT * FROM BKPF
WHERE BUKRS = ‘EH01’
AND BSTAT IN (‘ ‘,’A’,’B’,’D’,’L’,’M’,’S’,’V’,’W’,’Z’)
AND BUDAT IN SO_BUDAT.
ENDSELECT.
GET RUN TIME FIELD F_TIME2.
GET TIME FIELD F_ENDTIME.
F_RUNTIME = F_TIME2 – F_TIME1.
“WRITE:/ F_STARTTIME, ‘~’, F_ENDTIME.
WRITE :/ ‘인덱스 사용 된 경우 = ‘, F_RUNTIME.
|
▼ 실행 결과 측정 화면입니다.
마무리
이상으로 ABAP에서 인덱스(Index)를 사용하여 실행 시간을 단축 시키는 방법(튜닝 가이드)에 대한 간단한 설명을 해 보았습니다.
실행결과에서 보면 알 수 있듯 INDEX로 실행되었을 떄와 그렇지 않았을 때의 실행시간은 10배가 넘게 엄청난 차이를 보이고 있습니다. 결산이 돌아가는 등 시스템 사용 환경에 따라 그 결과는 더욱 큰 차이를 보일 수 있습니다.
실행시간 향상을 위해 모든 프로그램의 쿼리문에 맞는 인덱스를 무작정 생성할 수는 없습니다. 기존 인덱스를 쿼리문이 사용할 수 있도록 WHERE절을 적절히 선언하는 것도 인덱스를 생성하는 것 이상으로 무척이나 중요하다는 것을 예제를 통해 알 수가 있습니다.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
이 글이 도움이 되었기를 바랍니다. ^-^