ABAP SQL 튜닝 ① - 왜 SQL이 병목이 되는가

ABAP SQL 튜닝 1편 배너

들어가며 - Open SQL과 ABAP SQL

시작하기 전에 용어부터 정리합니다. 오랫동안 Open SQL이라 불리던 것이, 릴리스 7.53 무렵부터 공식 명칭이 ABAP SQL로 바뀌었습니다.

같은 것을 가리키는 다른 이름이라고 보면 됩니다. 이 시리즈에서는 ABAP SQL로 쓰되, 검색 편의를 위해 Open SQL도 병기하겠습니다.

왜 SQL이 병목이 되는가

ABAP 프로그램이 느릴 때, 원인은 크게 둘 중 하나입니다.

ABAP 처리애플리케이션 서버가 바쁘다

내부 테이블 루프, 반복 연산, 비효율적인 알고리즘. 코드 자체가 느린 경우입니다.

DB 접근데이터베이스를 기다린다

느린 쿼리, 과한 조회량, 너무 잦은 왕복. 대부분의 실무 성능 문제가 이쪽입니다.

경험적으로 후자가 압도적으로 많습니다. 이유는 구조에 있습니다.

ABAP 프로그램은 애플리케이션 서버에서 돌고, 데이터는 데이터베이스에 있습니다. 둘은 네트워크로 분리되어 있습니다. 내부 테이블을 한 번 더 도는 비용과, DB에 한 번 더 갔다 오는 비용은 차원이 다릅니다.

그래서 SQL 튜닝의 큰 방향은 늘 같습니다.

DB에 덜 가고, 갈 때는 꼭 필요한 만큼만 가져온다.

5가지 황금률

SAP 성능 가이드에서 오래 쓰여온 원칙입니다. 이 시리즈의 뼈대이기도 합니다.

#원칙다루는 편
1결과 집합을 줄여라 — 필요한 행만②편
2전송량을 줄여라 — 필요한 열만③편
3접근 횟수를 줄여라 — DB 왕복을 최소화④편
4검색 비용을 줄여라 — 인덱스를 타게②편
5DB 부하를 줄여라 — 버퍼·중복 조회 관리④편

원칙 자체는 단순합니다. 문제는 실제 코드에서 이걸 어떻게 알아보고 어떻게 고치느냐이고, 나머지 편들이 그 이야기입니다.

측정하지 않고 튜닝하지 마라

이 시리즈에서 가장 강조하고 싶은 원칙입니다.

WARNING

감으로 튜닝하면 대부분 엉뚱한 곳을 고칩니다. "이 쿼리가 느릴 것 같다"는 직관은 자주 틀립니다. 실제로는 전혀 의심하지 않던 곳에서 시간을 다 쓰고 있는 경우가 많습니다.

흔한 실패 사례가 있습니다. 복잡해 보이는 JOIN 쿼리를 며칠 걸려 최적화했는데 전체 시간이 그대로인 경우입니다. 재보니 그 쿼리는 전체의 3%였고, 루프 안에서 10만 번 돌던 단순 조회가 80% 였습니다.

!잘못된 순서고치고 나서 재본다

의심되는 코드를 먼저 손보고 결과를 확인합니다. 대개 효과 없는 수정에 시간을 쓰게 됩니다.

올바른 순서재고 나서 고친다

측정으로 비중 상위를 먼저 찾고, 거기만 고칩니다. 그리고 다시 재서 효과를 확인합니다.

측정 도구

상황에 따라 쓰는 도구가 다릅니다.

도구보는 것언제
ST05내 세션이 실행한 SQL 전체 내역재현 가능한 특정 프로그램
SATABAP 코드별 소요 시간어디가 느린지 모를 때
ST04DB 전체 부하재현이 안 되는 문제, 누적 부하
SQLM운영 중 실행된 SQL의 통계 수집전체 시스템에서 문제 SQL 찾기
SWLTSQLM 결과 + 정적 검사 결합튜닝 대상 우선순위 정하기
ATC소스 정적 검사코드 리뷰·이관 전 사전 차단

개발자가 실제로 쓰는 순서

STEP 1SATABAP인가 DB인가
STEP 2ST05어떤 SQL이 문제인가
STEP 3수정 후 재측정효과 확인
TIP

ST05에서 볼 때 실행 시간만 보지 말고 실행 횟수를 함께 보세요. 5ms짜리 쿼리도 5만 번이면 250초입니다. 실무에서 만나는 문제의 상당수가 이 유형입니다.

S/4HANA에서 달라진 것

이 시리즈는 S/4HANA(HANA DB) 를 기준으로 씁니다. 전통적인 디스크 기반 DB와 전제가 다른 부분이 있어서, 예전 튜닝 상식이 그대로 통하지 않는 지점이 생깁니다.

  • 컬럼 스토어 — 열 단위로 저장하므로 SELECT * 의 손해가 더 커집니다. (③편)
  • 인덱스 전략이 다르다 — 예전처럼 보조 인덱스를 많이 만드는 접근이 항상 정답은 아닙니다. (②편)
  • Code-to-Data — 계산을 ABAP이 아니라 DB에서 하도록 옮기는 방향입니다. (⑦편)
INFO

다만 "HANA니까 대충 짜도 빠르다"는 오해는 경계해야 합니다. 잘못된 접근 패턴(특히 루프 안의 SELECT)은 어떤 DB에서도 느립니다.

시리즈 로드맵

주제
① (이 글)왜 SQL이 병목이 되는가 · 측정 도구
결과 집합을 줄여라 — WHERE절과 인덱스
전송량을 줄여라 — SELECT * 와 필드 리스트
접근 횟수를 줄여라 — 루프 안의 SELECT, FOR ALL ENTRIES
대량 조회 ① 속도 — OFFSET vs 키셋 페이징
대량 조회 ② 메모리 — PACKAGE SIZE와 커서
S/4HANA Code-to-Data — CDS·AMDP

정리

  • 성능 문제의 대부분은 DB 접근에 있습니다.
  • 큰 방향은 하나입니다. 덜 가고, 덜 가져온다.
  • 무엇보다 측정이 먼저입니다. 감으로 고치면 시간만 씁니다.
  • 실행 시간뿐 아니라 실행 횟수를 보세요.

다음 편에서는 첫 번째 황금률, 결과 집합 줄이기부터 시작합니다.

Disclaimer — 이 포스트는 AI(Claude)를 활용하여 작성된 초안을 바탕으로 검수 및 보완하여 작성되었습니다. 내용 중 오류나 오타가 있다면 댓글로 알려주시면 감사하겠습니다.