활용사례SQL Viewer

SQL Viewer

#현업 민원 대응 #S/4HANA 전환 후 SQL 규명 #커스텀 코드 진단

느린 트랜잭션의 원인,
그 안의 SQL 몇 건일 수 있습니다.

트랜잭션 하나에서는 여러 건의 SQL이 실행됩니다. 응답시간을 구간별로 나눠도 'DB에서 시간이 소요됐다'는 것까지만 알 수 있을 뿐, 그 시간이 실제로 어떤 SQL에 사용되었는지는 알 수 없습니다.
OWLens SQL Viewer는 DB 구간을 개별 SQL 단위로 분해해, 원인이 된 SQL과 그 실행 파라미터 값, 호출 방식까지 확인합니다.

SQL Viewer — SQL 목록 · 문장 · 바인드 변수 · 실행 계획
SQL Viewer — SSR 정보 · SQL 목록 · SQL 문장 · 바인드 변수 목록 · 실행 계획 (Oracle 환경)
Problem · Pain Point

수십 개의 SQL 중,
시간을 잡아먹은 SQL은 단 두 건입니다.

현업에서 특정 화면의 응답이 30초씩 걸린다는 문의가 들어옵니다. 응답시간을 구간별로 나눠 보면 대부분 DB 시간이라는 것까지는 확인할 수 있습니다. 하지만 해당 트랜잭션이 실행되는 SQL은 수십 건에 이르고, 그중 어떤 SQL이 실제 DB 시간을 차지했는지는 그 안을 열어보기 전까지 알 수 없습니다. 대부분은 0.1초짜리이고, 문제는 그 사이에 섞여 있는 단 두 건입니다.

응답시간 30초 — 구간으로 나누면 여기까지

처리 기타 DB Time 25초

그 25초를 SQL 단위로 열어보면 — 20종 중 두 건이 대부분을 차지합니다

13.0 s
12.0 s
0.1 s
0.1 s
0.1 s

… 나머지 15종 · 합계 0.9초 (예시)

응답시간 구간 분해는 DB까지 보이지만, 어떤 SQL이 시간을 썼는지는 알 수 없습니다.

응답시간을 구간별로 분해하면 'DB에서 시간을 썼다'까지는 확인할 수 있습니다. 하지만 그 시간을 만든 SQL이 한 건인지 여러 건인지, 그중 어떤 SQL이 시간을 썼는지는 구간 정보만으로 알 수 없습니다.

누적 집계 목록에는 문제의 SQL이 보이지 않을 수 있습니다.

DB 레벨의 고부하 SQL 목록은 시스템 전체를 기준으로 누적 집계되기 때문에, 실행 빈도가 낮은 SQL은 목록에 나타나지 않을 수 있습니다. 현업에서는 해당 화면이 매번 30초씩 걸리더라도, 전체 누적 집계에서는 보이지 않을 수 있습니다.

민원 발생 후 재현으로는 그때의 SQL을 다시 볼 수 없습니다.

실제 SQL과 실행 값을 확인하려면 트레이스를 켜고 동일한 상황을 재현하거나, DB 관리자 권한으로 별도의 전용 뷰를 조회해야 합니다. 하지만 민원이 발생한 뒤 상황을 재현하더라도, 문제가 발생했던 그 시점의 SQL 실행을 그대로 되살릴 수는 없습니다.

Solution · OWLens 해결

OWLens는 이렇게 해결합니다.

01

느린 트랜잭션에서 출발합니다.

현업이 지목한 화면, 즉 해당 T-code·리포트의 실행 건에서 시작합니다. 시스템 전체의 고부하 SQL에서 찾아 내려오는 방식이 아니라, 문제가 발생한 해당 업무의 트랜잭션에서부터 시작합니다.

02

DB 시간을 개별 SQL 단위로 분해합니다.

해당 트랜잭션에서 실행된 SQL을 목록으로 펼치고, 각 SQL의 소요 시간과 호출 지점(Source Module)을 함께 표시합니다. 수십 건의 SQL 가운데 실제로 DB 시간을 차지한 SQL이 바로 드러납니다.

SQL Command 목록 — 시작 일시 · SQL Time · Source Module

▲ 트랜잭션이 실행한 SQL 목록과 각 건의 소요 시간

분해가 알려주는 두 가지 답 자세히 보기
03

그 SQL의 문장·실행 값·호출 방식을 확인합니다.

목록에서 해당 SQL을 선택하면 문장 전문과 함께 상세가 열립니다. 실행에 사용된 파라미터 값, 호출된 코드 위치(컴포넌트·소스 라인), 소모한 CPU·메모리, 그리고 데이터베이스를 어떤 방식으로 읽었는지까지 확인해 원인을 규명합니다.

SQL 문맥 탭 — CPU time · 레코드 건수 · 메모리 · 컴포넌트 명 · 오퍼레이션 목록
SQL 페러미터 탭 — 번호별 실행 값

▲ 선택한 SQL의 상세 탭 — SQL 문맥(좌) · SQL 페러미터(우)

SQL Viewer 화면 자세히 보기
04

개선 대상을 정확히 인계합니다.

문제가 SQL 자체인지 코드 구조인지에 따라 개발·DBA로 대상을 구분해 전달합니다. 실행된 SQL 전부를 검토하는 대신, 문제가 확인된 소수의 SQL에만 집중할 수 있습니다.

같은 DB 시간이라도, 분해해 보면 처방이 정반대입니다.

무거운 SQL 소수

소수의 SQL이 DB 시간 대부분을 차지합니다.
해당 SQL 자체가 대량의 데이터를 읽고 있습니다.

→ SQL·인덱스·조건 튜닝 (DBA·개발)

가벼운 SQL 다수

개별로는 짧은 SQL이 수십·수백 회 반복됩니다.
루프 안에서 SELECT가 호출되는 코드 구조입니다.

→ 코드 구조 개선 (개발)

DB 시간의 총합만 보면 두 경우가 구분되지 않습니다. 분해해야 무엇을 고쳐야 하는지 정해집니다.

Value · 역할별 가치

담당 업무별 활용 효과

IT 책임자

성능 개선의 대상을 데이터로 확정해, 원인이 확인되지 않은 상태에서 불필요한 인프라를 증설하는 과투자를 방지할 수 있습니다.

운영 담당자

현업이 지목한 화면이 왜 느린지 확인해 업무 영향을 판단하고, 개선이 필요한 지점을 근거와 함께 정확히 전달할 수 있습니다.

BC (Basis)

시간을 차지한 SQL과 실행 값·호출 방식을 확인해, 코드 문제는 개발팀으로, DB 문제는 DBA로 정확히 인계할 수 있습니다.

Difference · SAP 표준 도구와의 차별점

SAP 표준 도구와 OWLens 비교

구간 분해는 'DB에서 시간을 썼다'고 알려줍니다. 그 시간이 무엇이었는지는 열어봐야 알 수 있습니다. OWLens는 문제의 그 시간, 실행된 SQL까지 보여줍니다.

구분
SAP 표준
OWLens
출발
DB 전체 집계에서 하향 탐색
문제가 제기된 트랜잭션에서 시작
단위
SQL별 누적 총합
그 실행 한 건 안의 SQL 내역
확인
트레이스 재현·DB 권한 필요
실행된 그대로 화면에서
Free Demo

느린 트랜잭션의 SQL 내역을 확인하십시오.

3개월 무료 데모와 설치·교육을 무상으로 제공합니다. 지금 바로 경험해 보세요.

해결 ② · DB 시간 분해

분해하면 두 가지 중 하나가 드러납니다.

SQL 목록 · 각 SQL의 소요 시간 · 호출 지점(Source Module)

목록에서 확인하는 것
시작 일시각 SQL이 실행된 시점 (순서와 간격을 확인)
SQL Time해당 SQL이 소요한 시간 (시간을 가져간 건을 즉시 식별)
Source Module그 SQL이 호출된 코드상의 위치 (어느 프로그램의 어느 지점인지)
패턴 ① 소수의 무거운 SQL

실행된 SQL 가운데 소수의 건이 전체 DB 시간의 대부분을 차지합니다. 해당 SQL이 대량의 데이터를 읽고 있으며, 조건·인덱스·통계가 점검 대상입니다.

→ SQL 자체를 튜닝합니다.

패턴 ② 가벼운 SQL의 반복

개별로는 짧은 SQL이 수십·수백 회 반복 호출됩니다. 루프 안에서 SELECT가 수행되는 구조로, SQL 한 건을 튜닝해도 총합은 크게 줄지 않습니다.

→ 코드 구조를 개선합니다.

S/4HANA 전환 과정에서 자주 확인되는 패턴입니다. 반복 호출·조건 없는 대량 조회·중첩 조회는 이전 환경에서 문제가 되지 않다가 전환 후 드러나는 경우가 많습니다.

총합만 보면 두 패턴이 같아 보입니다. 분해해야 무엇을 고쳐야 하는지가 정해집니다.

해결 ③ · SQL Viewer

SQL을 목록에서 고르고, 그 한 건을 상세히 확인합니다.

SQL Command 목록 → 선택 → 문장 · 문맥 · 파라미터 · DB 호출 상세

HANA DB 환경의 SQL Viewer 화면

▲ HANA DB 환경의 SQL Viewer 화면

① 상단 : 어느 트랜잭션의 SQL인지
SSR 정보시스템 · 인스턴스 · 사용자 ID · 시작/종료 일시 · R.T.(ms) · DB Time(ms) · T-Code · Report · Reference Program · Internal Command

응답시간과 그중 데이터베이스 소요 시간이 함께 표시되어, 분해할 대상의 규모를 먼저 확인합니다.

② SQL Command 목록 : 실행된 SQL이 행으로 나열
시작 일시각 SQL이 실행된 시점 (순서와 간격으로 반복 호출 여부를 확인)
SQL Time해당 SQL이 소요한 시간 (시간을 가져간 건을 즉시 식별)
Source Module호출된 코드상의 위치 (예: 클래스·프로그램 :라인)

DB Time이 10,216ms인 트랜잭션에서 한 건의 SQL Time이 10,078ms라면, 그 한 건이 사실상 전부입니다. 목록에서 그 행을 선택해 상세로 들어갑니다.

③ SQL 문장 : 선택한 SQL의 전문

선택한 행의 SQL 문장이 그대로 표시됩니다. 파라미터 자리는 ?로 표기되며, 실제 값은 아래 SQL 페러미터 탭에서 확인합니다.

④ 선택한 SQL의 상세 : 세 개의 탭
SQL 문맥 (이 SQL이 무엇을 소모했고, 어디서 호출됐는가)
CPU 시간이 SQL 처리에 사용된 CPU 시간
레코드 건수처리된 레코드 수 → 대량 조회 여부의 근거
Lock 대기 건수 · 시간락 경합으로 대기한 횟수와 시간
메모리 사용량 · 재사용 메모리이 SQL이 점유한 메모리 → 인메모리 환경에서 자원 압박의 직접 요인
컴포넌트 명 · 소스 라인호출한 프로그램과 코드 위치 → 수정 대상과 담당을 특정
에러 코드실행 중 발생한 오류 여부
오퍼레이션 목록오퍼레이션 명 · 수행 시간(ms) → 이 SQL이 수행한 작업 단위별 소요 시간
SQL 페러미터 (어떤 값으로 실행됐는가)
번호 · 값SQL 문장의 ? 자리에 전달된 실제 값이 순서대로 표시됩니다 (예: 날짜·시각·플래그·코드 값)

동일한 SQL이라도 전달된 조건 값에 따라 읽는 범위가 달라집니다. 값이 있어야 그 실행이 왜 무거웠는지 판단하고 재현할 수 있습니다.

SAP > DB 호출 상세 (어떤 방식으로 읽었는가)
연결 정보Connection · Database request total · DB Proc. Calls · Request time · Commit time · DB Proc. time
요청 유형Total · Direct read · Sequential read · Update · Delete · Insert
유형별 지표Database rows · Requests · Requests to buffer · Database calls · Request time(ms) · Avg. time / row(ms)

Sequential read의 rows가 크면 조건 없는 대량 조회를, Requests 횟수가 크면 반복 호출을, Requests to buffer 비중이 낮으면 버퍼 활용도를 점검합니다. 앞서 본 두 패턴이 여기서 수치로 확정됩니다.

ECC 등 Oracle 데이터베이스 환경에서도 동일하게 목록에서 SQL을 선택해 상세를 확인합니다. 데이터베이스가 제공하는 정보 체계가 달라 항목 구성에 차이가 있으며, Oracle 환경에서는 바인드 변수 목록실행 계획을 함께 제공합니다.

Oracle DB 환경의 SQL Viewer 화면

▲ Oracle DB 환경의 SQL Viewer 화면

확인 항목
SSR 정보시스템 · 사용자 ID · 시작/종료 일시 · Report · T-Code · Reference Program · Internal Command
SQL 목록시작 일시 · SQL ID · SQL Child No. · 세션 일련번호 · Module · Action
SQL 문장선택한 SQL의 전문
바인드 변수 목록변수명 · 데이터 타입 · 실제 값
실행 계획ID · PID · Operation · Cost · Cardinality · Bytes — 옵티마이저가 선택한 처리 경로

Oracle 환경에서는 SQL ID·Child Number 체계로 SQL을 식별하며, 실행 계획에서 처리 경로와 비용을 단계별로 확인할 수 있습니다.

목록에서 시간을 가져간 SQL을 고르고, 그 한 건을 어떤 값으로 · 어느 코드에서 · 어떤 방식으로 실행했는지까지 확인해 개선 대상을 확정합니다.