"어제까지는 3초 만에 조회되던 화면이 오늘은 30초나 걸립니다."
"지난달 거래 내역은 빠르게 나오는데, 이번 달 데이터는 왜 이렇게 느릴까요?"
"SQL을 조금 수정했을 뿐인데 조회 시간이 크게 달라졌습니다."
금융 IT 업무를 하다 보면 현업 부서에서 이런 문의를 받는 경우가 있습니다.
특히 신용카드회사나 은행처럼 대량의 거래 데이터를 처리하는 금융회사에서는 데이터 조회 성능이 업무 효율에 직접적인 영향을 미칩니다.
영업 실적을 확인하거나 고객 이용 현황을 분석하고, 월별 카드 승인 금액을 집계하는 과정에서 SQL은 중요한 역할을 합니다.
그런데 같은 데이터를 조회하더라도 SQL 작성 방식이나 데이터베이스의 처리 방법에 따라 실행 시간이 크게 달라질 수 있습니다.
어떤 SQL은 필요한 데이터만 효율적으로 읽지만, 다른 SQL은 불필요하게 많은 데이터를 읽거나 대규모 정렬 작업을 수행할 수 있기 때문입니다.
그렇다면 SQL이 느려지는 원인은 무엇일까요?
인덱스만 만들면 해결될까요?
실행 계획은 어떻게 확인해야 할까요?
DW 운영담당자는 성능 문제가 발생했을 때 무엇부터 점검해야 할까요?
이번 글에서는 SQL 조회가 느려지는 대표적인 원인 7가지와 실행 계획을 활용한 성능 분석 방법을 금융 IT 실무 관점에서 알아보겠습니다.
※ 본문의 SQL과 데이터는 모두 설명을 위한 가상 예시입니다. 실제 실행 계획과 성능 개선 효과는 데이터베이스 제품, 버전, 데이터 분포, 인덱스 및 파티션 구성, 시스템 자원에 따라 달라집니다.

전체 목차
- 금융회사에서 SQL 성능이 중요한 이유
- SQL이 실행되는 기본 과정
- SQL 조회가 느려지는 대표적인 원인 7가지
- 인덱스가 있으면 무조건 빠를까?
- 실행 계획(Execution Plan)을 읽는 기본 방법
- SQL 작성 방식에 따른 성능 차이
- DW 환경에서 특히 주의해야 할 대용량 데이터 처리
- 실제 사례로 보는 SQL 성능 분석
- SQL 성능 개선 시 반드시 확인할 체크리스트
- 생성형 AI를 SQL 분석에 활용하는 방법
- 자주 묻는 질문
- 마무리
1. 금융회사에서 SQL 성능이 중요한 이유
금융회사에서는 매일 수많은 거래 데이터가 발생합니다.
신용카드회사를 예로 들어보겠습니다.
카드 승인, 매입, 취소, 청구, 가맹점 이용 내역 등 다양한 데이터가 업무 시스템에서 생성됩니다.
이러한 데이터는 업무 목적에 따라 DW나 분석 시스템으로 전달되어 보고서와 통계 자료를 만드는 데 활용될 수 있습니다.
예를 들어 현업 부서에서는 다음과 같은 조회를 요청할 수 있습니다.
- 전월 카드 승인 금액 집계
- 업종별 가맹점 이용 현황
- 카드 상품별 이용 고객 수
- 일자별 승인 및 취소 건수
- 지역별 카드 이용 금액
- 최근 1년간 거래 추이
이러한 조회가 느려지면 단순히 화면이 늦게 표시되는 문제를 넘어 업무 전체에 영향을 줄 수 있습니다.
SQL 성능 저하가 가져오는 문제
첫째, 현업 업무 시간이 늘어납니다.
조회 결과를 기다리는 시간이 길어지면 분석과 보고서 작성이 지연됩니다.
둘째, 시스템 자원을 많이 사용합니다.
비효율적인 SQL은 CPU, 메모리, 디스크 I/O 등의 자원을 많이 사용할 수 있습니다.
셋째, 다른 사용자에게도 영향을 줄 수 있습니다.
하나의 SQL이 많은 시스템 자원을 사용하면 동일한 시스템에서 실행되는 다른 작업의 성능에도 영향을 줄 수 있습니다.
넷째, 배치 작업 시간이 길어질 수 있습니다.
DW에서는 대량의 데이터를 적재하거나 집계하는 배치 작업이 많습니다.
SQL 성능이 저하되면 전체 작업 완료 시간이 늦어질 수 있습니다.
따라서 금융 IT 운영에서 SQL 성능 관리는 단순한 속도 개선이 아니라 안정적인 데이터 서비스 운영을 위한 중요한 활동입니다.
2. SQL이 실행되는 기본 과정
SQL 성능을 이해하려면 데이터베이스가 SQL을 어떻게 처리하는지 알아야 합니다.
일반적으로 데이터베이스는 SQL을 입력받으면 실행 가능한 처리 방법을 결정하고 데이터를 조회합니다.
이 과정을 단순화하면 다음과 같습니다.
SQL 입력 → 구문 및 객체 확인 → 실행 계획 수립 → 데이터 접근 및 처리 → 결과 반환
① SQL 구문 확인
먼저 SQL 문장이 올바르게 작성되었는지 확인합니다.
테이블과 컬럼이 존재하는지, 사용자가 필요한 권한을 가지고 있는지 등을 확인하는 과정도 포함될 수 있습니다.
② 실행 계획 수립
데이터베이스의 옵티마이저(Optimizer)는 SQL을 처리할 방법을 결정합니다.
예를 들어 다음과 같은 사항을 선택할 수 있습니다.
- 테이블 전체를 읽을 것인가?
- 인덱스를 이용할 것인가?
- 어떤 테이블부터 조회할 것인가?
- 어떤 방식으로 테이블을 조인할 것인가?
- 정렬과 집계는 어떻게 처리할 것인가?
이때 결정된 처리 방법을 실행 계획이라고 합니다.
③ 데이터 접근 및 처리
실행 계획에 따라 데이터를 읽고 조건을 적용하며 조인, 정렬, 집계 등을 수행합니다.
④ 결과 반환
최종적으로 처리된 결과를 사용자나 응용프로그램에 전달합니다.
여기서 중요한 점이 있습니다.
SQL 문장이 같더라도 실행 계획이 달라지면 성능이 달라질 수 있습니다.
반대로 실행 계획이 같더라도 데이터량이나 시스템 자원 상태에 따라 실행 시간은 달라질 수 있습니다.
3. SQL 조회가 느려지는 대표적인 원인 7가지
SQL 성능 저하에는 여러 원인이 있습니다.
금융 IT 운영에서 자주 검토하는 대표적인 원인을 일곱 가지로 정리하겠습니다.
원인 ① 불필요하게 많은 데이터를 읽는 경우
가장 먼저 확인할 부분은 실제로 얼마나 많은 데이터를 읽고 있는지입니다.
예를 들어 특정 하루의 거래 내역만 필요한데 전체 거래 데이터를 읽고 있다면 불필요한 작업이 발생할 수 있습니다.
비효율적인 조회 예시
SELECT *
FROM SAMPLE_CARD_TXN;
이 SQL은 별도의 조회 조건 없이 테이블의 모든 행과 컬럼을 요청합니다.
데이터량이 많다면 상당한 처리 비용이 발생할 수 있습니다.
물론 전체 데이터가 필요한 업무라면 전체 조회 자체가 잘못된 것은 아닙니다.
중요한 것은 업무에 필요한 범위만 조회하고 있는지 확인하는 것입니다.
원인 ② 적절한 인덱스가 없는 경우
인덱스는 데이터베이스가 특정 데이터를 효율적으로 찾는 데 도움을 줄 수 있는 자료구조입니다.
책의 맨 뒤에 있는 색인을 생각하면 이해하기 쉽습니다.
특정 단어가 어느 페이지에 있는지 알기 위해 책 전체를 처음부터 읽는 대신 색인을 이용하는 것과 비슷합니다.
하지만 인덱스가 없거나 조회 조건에 적합하지 않다면 많은 데이터를 읽어야 할 수 있습니다.
원인 ③ 인덱스를 활용하기 어려운 조건을 사용하는 경우
인덱스가 존재하더라도 SQL 작성 방식에 따라 효율적으로 활용하지 못할 수 있습니다.
예를 들어 날짜 컬럼에 함수를 적용하는 경우가 있습니다.
SELECT COUNT(*)
FROM SAMPLE_CARD_TXN
WHERE SUBSTR(TXN_DATE, 1, 6) = '202610';
이 예제는 TXN_DATE가 YYYYMMDD 형식의 문자형 컬럼이라고 가정한 것입니다.
컬럼에 함수를 적용하면 일반적인 인덱스 접근이나 파티션 조건 처리에 불리할 수 있습니다.
다만 함수 기반 인덱스 등 데이터베이스의 기능에 따라 예외가 있습니다.
원인 ④ 통계정보가 실제 데이터 상태와 맞지 않는 경우
데이터베이스 옵티마이저는 데이터의 양과 분포 등에 관한 통계정보를 참고해 실행 계획을 선택할 수 있습니다.
그런데 데이터량이 크게 변했거나 통계정보가 현재 상태를 충분히 반영하지 못한다면 비효율적인 실행 계획이 선택될 수 있습니다.
특히 대량 데이터가 주기적으로 적재되는 DW 환경에서는 통계정보 관리가 중요할 수 있습니다.
원인 ⑤ 비효율적인 조인 처리
여러 테이블을 연결하는 조인도 성능에 큰 영향을 줄 수 있습니다.
예를 들어 대량의 거래 테이블과 가맹점 테이블을 조인한다고 가정하겠습니다.
조인 조건이 잘못되었거나 필요한 필터가 적절하게 적용되지 않으면 처리해야 할 데이터량이 크게 증가할 수 있습니다.
특히 조인 조건이 누락되어 의도하지 않은 대규모 결과가 생성되는 상황을 주의해야 합니다.
원인 ⑥ 대규모 정렬과 집계
ORDER BY, GROUP BY, DISTINCT 등의 처리는 데이터량과 실행 계획에 따라 많은 자원을 사용할 수 있습니다.
예를 들어 수억 건의 거래 데이터를 카드 상품별로 집계한다면 데이터 읽기뿐 아니라 집계 처리에도 상당한 비용이 발생할 수 있습니다.
원인 ⑦ 시스템 자원 또는 동시 실행 작업의 영향
SQL 자체에 큰 문제가 없어도 시스템 상황에 따라 성능이 저하될 수 있습니다.
대표적인 원인은 다음과 같습니다.
- CPU 사용량 증가
- 메모리 부족
- 디스크 I/O 지연
- 다른 SQL과의 자원 경합
- 잠금 대기
- 동시 실행 작업 증가
- 네트워크 또는 결과 전송 지연
따라서 SQL이 느리다고 해서 무조건 SQL 문장만 수정하는 것은 적절하지 않을 수 있습니다.
SQL 성능 저하 원인 요약
원인주요 점검 항목
| 원인 | 주요 점검 항목 |
| 과도한 데이터 조회 | 조회 조건과 실제 읽은 데이터량 |
| 인덱스 문제 | 인덱스 존재 여부와 접근 방식 |
| 함수·조건식 문제 | 조건절과 컬럼 자료형 |
| 통계정보 문제 | 통계정보 상태와 추정 행 수 |
| 조인 문제 | 조인 조건과 처리 순서 |
| 정렬·집계 문제 | 정렬량, 집계량, 메모리 사용 |
| 시스템 자원 문제 | CPU, I/O, 대기 이벤트, 동시 작업 |
4. 인덱스가 있으면 무조건 빠를까?
SQL 성능 문제를 이야기하면 가장 먼저 등장하는 단어가 인덱스입니다.
하지만 인덱스가 있다고 해서 모든 SQL이 빨라지는 것은 아닙니다.
인덱스가 효과적일 수 있는 경우
예를 들어 수백만 건의 거래 중 특정 거래번호 한 건을 찾는 상황을 생각해 보겠습니다.
SELECT
TXN_ID,
TXN_DATE,
APPROVED_AMOUNT
FROM SAMPLE_CARD_TXN
WHERE TXN_ID = 'SAMPLE-00001';
거래번호에 적절한 인덱스가 있다면 전체 데이터를 읽지 않고 필요한 데이터를 효율적으로 찾을 가능성이 있습니다.
인덱스가 반드시 유리하지 않은 경우
반대로 전체 거래의 상당 부분을 조회해야 한다면 인덱스를 사용하는 것보다 테이블을 순차적으로 읽는 방식이 더 효율적일 수 있습니다.
인덱스를 통해 많은 행을 찾은 뒤 실제 테이블 데이터까지 반복적으로 접근해야 하기 때문입니다.
특히 대량 집계가 많은 DW 환경에서는 전체 스캔이나 병렬 처리 등이 더 적합한 경우도 있습니다.
인덱스가 많으면 좋을까?
인덱스를 추가하면 조회 성능이 개선될 수 있지만 저장 공간과 데이터 변경 작업의 유지관리 비용도 증가할 수 있습니다.
따라서 인덱스를 무조건 많이 만드는 것이 좋은 방법은 아닙니다.
인덱스는 존재 여부보다 실제 조회 조건과 데이터 분포에 적합한지가 중요합니다.
5. 실행 계획(Execution Plan)을 읽는 기본 방법
SQL 성능 분석에서 중요한 도구 중 하나가 실행 계획입니다.
실행 계획은 데이터베이스가 SQL을 어떤 방식으로 처리할 것인지 보여줍니다.
다만 데이터베이스 제품마다 실행 계획을 확인하는 방법과 표시되는 항목이 다릅니다.
실행 계획에서 확인할 주요 항목
① 테이블 접근 방식
테이블 전체를 읽는지, 인덱스를 이용하는지 확인합니다.
② 조인 방식
여러 테이블을 어떤 순서와 방법으로 연결하는지 확인합니다.
③ 예상 처리 행 수
옵티마이저가 각 처리 단계에서 몇 건의 데이터를 다룰 것으로 예상하는지 확인합니다.
④ 실제 처리 행 수
실제 실행 통계를 확인할 수 있는 환경이라면 예상 행 수와 실제 행 수를 비교합니다.
⑤ 정렬 및 집계 처리
대규모 정렬이나 집계가 발생하는 구간을 확인합니다.
⑥ 실행 시간과 자원 사용량
가능하다면 단계별 실행 시간, 읽은 데이터량, 메모리 사용, 대기 시간 등을 확인합니다.
가상의 실행 계획 예시
다음은 개념을 설명하기 위한 단순화된 예시입니다.
SELECT STATEMENT
HASH GROUP BY
TABLE ACCESS FULL
SAMPLE_CARD_TXN
이 실행 계획은 테이블 데이터를 읽고 집계 작업을 수행하는 형태로 이해할 수 있습니다.
하지만 TABLE ACCESS FULL이 표시되었다고 해서 무조건 잘못된 SQL이라는 의미는 아닙니다.
대량 데이터를 집계하는 작업에서는 전체 스캔이 적절할 수도 있습니다.
예상 행 수와 실제 행 수가 다른 경우
실행 계획 분석에서 중요한 부분 중 하나는 예상한 데이터량과 실제 처리한 데이터량의 차이입니다.
예를 들어 옵티마이저는 1,000건이 조회될 것으로 예상했지만 실제로는 100만 건이 처리되었다고 가정하겠습니다.
이처럼 차이가 크다면 데이터 분포, 통계정보, 조건 선택도 등을 추가로 검토할 수 있습니다.
다만 이 차이만으로 성능 저하 원인을 확정할 수는 없습니다.
실행 계획 확인 시 주의사항
실제 실행 통계를 수집하는 기능은 SQL을 실행하거나 추가 자원을 사용할 수 있습니다.
따라서 운영 환경에서는 데이터베이스 제품의 기능과 회사의 운영 기준에 따라 적절한 방법을 선택해야 합니다.
6. SQL 작성 방식에 따른 성능 차이
같은 목적의 SQL이라도 작성 방식에 따라 데이터베이스가 선택할 수 있는 실행 계획이 달라질 수 있습니다.
몇 가지 예시를 살펴보겠습니다.
사례 ① 날짜 조건 작성
TXN_DATE가 YYYYMMDD 형식의 문자형 컬럼이라고 가정하겠습니다.
예시 A: 컬럼에 함수 적용
SELECT COUNT(*)
FROM SAMPLE_CARD_TXN
WHERE SUBSTR(TXN_DATE, 1, 6) = '202610';
예시 B: 날짜 범위 조건 사용
SELECT COUNT(*)
FROM SAMPLE_CARD_TXN
WHERE TXN_DATE >= '20261001'
AND TXN_DATE < '20261101';
예시 B는 컬럼에 함수를 적용하지 않고 범위 조건으로 조회합니다.
이러한 방식은 적절한 인덱스나 파티션 구조가 있는 경우 효율적인 접근에 도움이 될 수 있습니다.
다만 반드시 더 빠르다고 단정할 수는 없으며 실제 실행 계획을 확인해야 합니다.
또한 TXN_DATE가 DATE 또는 TIMESTAMP 자료형이라면 해당 자료형에 맞는 날짜 리터럴이나 바인드 변수를 사용해야 합니다.
사례 ② 필요한 컬럼만 조회
예시 A
SELECT *
FROM SAMPLE_CARD_TXN
WHERE TXN_DATE = '20261020';
예시 B
SELECT
TXN_ID,
TXN_DATE,
APPROVED_AMOUNT
FROM SAMPLE_CARD_TXN
WHERE TXN_DATE = '20261020';
예시 B는 필요한 컬럼만 조회합니다.
이러한 방식은 불필요한 데이터 전송과 처리 부담을 줄이는 데 도움이 될 수 있습니다.
특히 컬럼 수가 많거나 대용량 컬럼이 포함된 테이블에서는 효과를 검토할 가치가 있습니다.
사례 ③ 조인 전에 필요한 범위 확인
다음과 같은 거래 테이블과 가맹점 테이블이 있다고 가정하겠습니다.
- SAMPLE_CARD_TXN: 카드 거래 정보
- SAMPLE_MERCHANT: 가맹점 정보
SELECT
M.CATEGORY,
COUNT(*) AS TXN_CNT,
SUM(T.APPROVED_AMOUNT) AS TOTAL_AMOUNT
FROM SAMPLE_CARD_TXN T
JOIN SAMPLE_MERCHANT M
ON T.MERCHANT_ID = M.MERCHANT_ID
WHERE T.TXN_DATE >= '20261001'
AND T.TXN_DATE < '20261101'
GROUP BY M.CATEGORY;
이 SQL은 특정 기간의 거래를 가맹점 업종별로 집계합니다.
성능을 검토할 때는 다음 사항을 확인할 수 있습니다.
- 거래 테이블의 기간 조건이 효율적으로 적용되는가?
- 조인 키의 자료형이 일치하는가?
- 가맹점 테이블의 키가 유일한가?
- 조인 과정에서 의도하지 않은 중복이 발생하지 않는가?
- 실행 계획에서 적절한 조인 방식이 선택되는가?
중요한 점은 SQL 문장의 작성 순서가 데이터베이스의 실제 처리 순서와 항상 일치하는 것은 아니라는 것입니다.
옵티마이저는 여러 처리 방법을 검토해 실행 계획을 선택할 수 있습니다.
7. DW 환경에서 특히 주의해야 할 대용량 데이터 처리
DW는 일반적인 온라인 거래 처리 시스템과 다른 특성을 가질 수 있습니다.
온라인 거래 처리 시스템이 개별 거래를 빠르고 정확하게 처리하는 데 중점을 둔다면, DW는 대량 데이터를 분석하고 집계하는 업무가 많습니다.
따라서 SQL 성능을 개선할 때도 다른 관점이 필요할 수 있습니다.
① 파티션을 활용한 데이터 접근
파티션은 큰 테이블이나 인덱스를 일정한 기준에 따라 논리적으로 나누어 관리하는 기능입니다.
예를 들어 거래 데이터를 월별로 구분할 수 있습니다.
| 파티션 예시 | 데이터 범위 |
| P202608 | 2026년 8월 거래 |
| P202609 | 2026년 9월 거래 |
| P202610 | 2026년 10월 거래 |
| P202611 | 2026년 11월 거래 |
이러한 구조에서 특정 월의 거래만 조회한다면 필요한 파티션만 읽도록 처리할 수 있습니다.
이를 파티션 프루닝(Partition Pruning)이라고 합니다.
다만 실제 프루닝 여부는 파티션 키, 조건절, 자료형, 실행 계획 등에 따라 달라집니다.
② 대량 데이터 집계
DW에서는 일별·월별·상품별 집계가 자주 발생합니다.
이때 동일한 집계를 반복 수행하면 시스템 부담이 증가할 수 있습니다.
업무 특성에 따라 사전 집계 테이블이나 물리화된 뷰(Materialized View) 등의 활용을 검토할 수 있습니다.
다만 사전 집계 구조는 데이터 최신성, 저장 공간, 유지관리 비용을 함께 고려해야 합니다.
③ 데이터 적재와 조회의 경합
DW에서는 데이터 적재 작업과 사용자 조회가 동시에 실행될 수 있습니다.
이때 시스템 자원을 공유하면서 성능에 영향을 줄 수 있습니다.
따라서 특정 시간에 SQL이 느려진다면 해당 시간대의 배치 작업이나 다른 대용량 SQL 실행 여부도 확인할 필요가 있습니다.
④ 데이터 증가에 따른 성능 변화
처음에는 빠르게 실행되던 SQL도 데이터가 지속적으로 증가하면 성능이 달라질 수 있습니다.
예를 들어 1년치 데이터를 조회할 때와 5년 치 데이터를 조회할 때 처리량은 크게 다를 수 있습니다.
이러한 상황에서는 단순한 SQL 수정뿐 아니라 데이터 보관 정책, 파티션 구성, 집계 구조 등을 함께 검토할 수 있습니다.
⑤ 데이터베이스 제품별 최적화 기능
DW 환경에서는 병렬 처리, 컬럼 기반 저장, 압축, 캐싱 등 다양한 기능이 사용될 수 있습니다.
하지만 이러한 기능은 데이터베이스 제품과 구성에 따라 지원 범위와 효과가 다릅니다.
따라서 실제 성능 개선은 사용 중인 데이터베이스의 특성을 고려해 진행해야 합니다.
8. 실제 사례로 보는 SQL 성능 분석
이번에는 가상의 DW 성능 문제를 통해 분석 과정을 살펴보겠습니다.
상황: 월별 카드 이용 현황 조회가 느려진 경우
현업 부서에서 다음과 같은 문의가 들어왔습니다.
"지난주에는 5초 정도 걸리던 월별 카드 이용 현황 조회가 오늘은 40초 이상 걸립니다."
운영담당자는 어떤 순서로 확인해야 할까요?
① 성능 저하가 발생한 시점 확인
먼저 언제부터 조회가 느려졌는지 확인합니다.
특정 날짜 이후부터 발생했는지, 특정 시간대에만 발생하는지 확인하는 것이 중요합니다.
② 조회 조건 확인
조회 기간과 검색 조건이 이전과 동일한지 확인합니다.
예를 들어 기존에는 1개월 데이터를 조회했지만 이번에는 1년 데이터를 조회했다면 실행 시간이 증가할 수 있습니다.
③ SQL 변경 여부 확인
SQL 문장이 변경되었는지 확인합니다.
새로운 조인이나 집계 조건이 추가되었다면 성능에 영향을 줄 수 있습니다.
④ 실행 계획 비교
성능이 정상적이었던 시점의 실행 계획을 확보할 수 있다면 현재 실행 계획과 비교합니다.
인덱스 접근 방식, 조인 순서, 예상 처리 행 수 등이 달라졌는지 확인합니다.
⑤ 데이터량 및 통계정보 확인
최근 대량 데이터 적재가 있었는지, 통계정보가 현재 데이터 상태를 적절하게 반영하는지 확인합니다.
⑥ 시스템 자원 확인
동일 시간대에 대용량 배치나 다른 SQL이 실행되고 있는지 확인합니다.
CPU, I/O, 메모리, 대기 이벤트 등을 함께 살펴봅니다.
⑦ 개선 방안 검토
가상의 사례에서는 조회 조건이 파티션 키를 효율적으로 활용하지 못하는 것으로 확인되었다고 가정하겠습니다.
운영담당자는 조회 조건과 실행 계획을 검토해 필요한 파티션만 읽도록 개선할 수 있는지 확인합니다.
⑧ 개선 결과 검증
SQL을 수정한 뒤에는 실행 시간만 비교해서는 안 됩니다.
다음 사항을 함께 확인해야 합니다.
- 조회 결과가 기존과 동일한가?
- 실행 시간이 개선되었는가?
- 읽은 데이터량이 감소했는가?
- CPU 및 I/O 사용량이 적절한가?
- 다른 SQL에 부정적인 영향을 주지 않는가?
- 운영 환경에서 안정적으로 실행될 수 있는가?
가상의 성능 비교
| 항목 | 개선 전 | 개선 후 |
| 조회 시간 | 42초 | 6초 |
| 읽은 데이터량 | 1억 건 | 800만 건 |
| 결과 건수 | 120건 | 120건 |
| 주요 처리 방식 | 광범위한 데이터 스캔 | 필요한 파티션 중심 조회 |
※ 위 수치는 이해를 돕기 위한 가상 사례이며, 실제 개선 효과를 보장하는 수치가 아닙니다.
이 사례에서 중요한 것은 단순히 조회 시간이 줄었다는 사실이 아닙니다.
불필요한 데이터 접근을 줄이면서도 조회 결과의 정확성을 유지했다는 점입니다.
9. SQL 성능 개선 시 반드시 확인할 체크리스트
실제 DW 운영에서 활용할 수 있도록 점검 항목을 정리하겠습니다.
1단계. 문제 상황 파악
-
SQL이 느려진 시점을 확인했는가?
-
조회 조건이 이전과 동일한가?
-
특정 사용자 또는 특정 시간대에만 발생하는가?
-
최근 프로그램이나 데이터 구조 변경이 있었는가?
2단계. SQL 구조 확인
-
불필요한 컬럼을 조회하고 있지 않은가?
-
조회 기간과 조건이 적절한가?
-
조인 조건이 정확한가?
-
함수 사용이나 자료형 변환이 접근 경로에 영향을 주는가?
-
불필요한 정렬이나 중복 제거가 있는가?
3단계. 실행 계획 분석
-
테이블 접근 방식이 적절한가?
-
인덱스가 필요한 곳에서 활용되는가?
-
예상 행 수와 실제 행 수에 큰 차이가 있는가?
-
대규모 조인·정렬·집계가 발생하는가?
-
파티션 프루닝이 적용되는가?
4단계. 데이터 및 시스템 상태 확인
-
데이터량이 증가했는가?
-
통계정보가 적절하게 관리되고 있는가?
-
CPU·메모리·I/O에 병목이 있는가?
-
다른 SQL이나 배치 작업과 경합하는가?
5단계. 개선 결과 검증
-
조회 결과의 정확성을 확인했는가?
-
동일하거나 비교 가능한 조건에서 성능을 측정했는가?
-
시스템 자원 사용량을 확인했는가?
-
운영 적용 전 테스트와 승인 절차를 거쳤는가?
-
변경 후 모니터링 계획이 있는가?
SQL 성능 개선에서는 속도, 정확성, 안정성을 함께 고려해야 합니다.
10. 생성형 AI를 SQL 분석에 활용하는 방법
최근에는 생성형 AI를 활용해 SQL 구조를 설명하거나 성능 점검 항목을 정리할 수 있습니다.
앞선 #10과 #11에서 설명했듯이 AI는 금융 IT 업무의 보조 도구로 활용할 수 있지만 정보보안과 결과 검증이 중요합니다.
AI 활용 사례 ① SQL 구조 설명
다음과 같이 질문할 수 있습니다.
다음은 실제 업무와 무관한 가상 SQL입니다.
SQL의 처리 목적과 각 절의 역할을 설명해 주세요.
성능에 영향을 줄 수 있는 요소와 실행 계획에서 확인할 항목을 정리해 주세요.
데이터베이스 제품과 실행 계획을 모르는 상태이므로 실제 성능을 단정하지 마세요.
AI 활용 사례 ② 성능 점검 체크리스트 작성
대용량 거래 테이블을 월별로 집계하는 SQL이 느린 상황입니다.
인덱스, 파티션, 통계정보, 조인, 정렬, 시스템 자원 관점에서 점검 항목을 정리해 주세요.
실제 원인을 확정하지 말고 가능한 원인과 확인 방법을 구분해 주세요.
AI 활용 사례 ③ SQL 재작성 방향 검토
다음 가상 SQL의 가독성을 개선하고, 성능 측면에서 검토할 수 있는 다른 작성 방식을 제안해 주세요.
단, SQL 결과가 동일한지는 별도 검증이 필요하다는 점을 고려해 주세요.
AI 활용 시 주의사항
금융회사에서는 실제 고객정보나 내부 데이터베이스 구조, 운영 로그 등을 승인되지 않은 외부 AI에 입력해서는 안 됩니다.
가상의 테이블과 데이터를 사용하거나 회사에서 승인한 AI 환경을 활용해야 합니다.
또한 AI가 제안한 SQL을 운영 환경에 바로 적용해서는 안 됩니다.
AI는 SQL 개선 방향을 검토하는 데 도움을 줄 수 있지만 실제 성능 검증과 운영 적용 판단은 담당자의 책임입니다.
11. 자주 묻는 질문
Q1. SQL이 느리면 인덱스를 추가하는 것이 가장 좋은 방법인가요?
반드시 그렇지는 않습니다.
조회 조건과 데이터 분포에 따라 인덱스가 도움이 될 수 있지만 대량 데이터를 읽는 작업에서는 전체 스캔이 더 효율적일 수도 있습니다.
실행 계획과 실제 처리량을 확인해야 합니다.
Q2. 실행 계획에서 전체 테이블 스캔이 나오면 문제가 있는 건가요?
그렇지 않습니다.
전체 테이블 스캔은 데이터베이스가 선택하는 정상적인 접근 방식 중 하나입니다.
대량 집계처럼 많은 데이터를 읽어야 하는 경우에는 적절한 선택일 수 있습니다.
Q3. 어제는 빠르던 SQL이 오늘 느려질 수 있나요?
네.
데이터량 증가, 통계정보 변화, 실행 계획 변경, 시스템 자원 경합 등 다양한 이유로 성능이 달라질 수 있습니다.
Q4. SQL 문장을 수정하지 않고도 성능이 개선될 수 있나요?
가능합니다.
통계정보 관리, 시스템 자원 문제 해결, 데이터베이스 설정 및 물리적 구조 개선 등으로 성능이 달라질 수 있습니다.
다만 실제 적용은 충분한 검토와 승인 절차가 필요합니다.
Q5. DW에서는 인덱스보다 파티션이 중요한가요?
어느 하나가 항상 더 중요하다고 볼 수는 없습니다.
조회 패턴과 데이터 구조에 따라 인덱스, 파티션, 병렬 처리, 사전 집계 등 다양한 방법을 검토해야 합니다.
Q6. SQL 성능을 비교할 때 실행 시간만 확인하면 되나요?
실행 시간은 중요한 지표지만 그것만으로 충분하지 않을 수 있습니다.
읽은 데이터량, CPU, I/O, 대기 시간, 결과 정확성 등을 함께 확인하는 것이 좋습니다.
Q7. 생성형 AI가 SQL 성능을 자동으로 개선해 줄 수 있나요?
AI는 SQL 재작성 방향과 점검 항목을 제안할 수 있습니다.
하지만 실제 데이터베이스 환경과 실행 계획을 확인하지 못한다면 성능 개선 효과를 정확하게 판단하기 어렵습니다.
따라서 검증 없이 운영 SQL에 적용해서는 안 됩니다.
12. 마무리|SQL 성능 개선의 시작은 인덱스가 아니라 원인 분석입니다
금융회사에서는 매일 많은 데이터가 생성되고 이를 분석하기 위한 SQL이 실행됩니다.
SQL 조회가 느려지면 현업 업무뿐 아니라 DW 운영과 배치 처리에도 영향을 줄 수 있습니다.
하지만 SQL 성능 문제는 단순히 인덱스가 없어서 발생하는 것은 아닙니다.
데이터량, 조회 조건, 실행 계획, 통계정보, 조인 방식, 정렬 작업, 시스템 자원 등 다양한 요소가 영향을 미칩니다.
오늘 내용을 세 가지로 정리하겠습니다.
첫째, SQL 성능이 저하되면 실제로 어떤 작업에서 시간이 많이 소요되는지 먼저 확인해야 합니다.
둘째, 인덱스와 파티션, 실행 계획은 중요한 분석 도구이지만 모든 SQL에 동일한 개선 방법을 적용할 수는 없습니다.
셋째, SQL 성능 개선 이후에는 실행 시간뿐 아니라 결과의 정확성과 시스템 안정성도 함께 검증해야 합니다.
금융 IT 운영담당자의 역할은 단순히 느린 SQL을 빠르게 만드는 데 그치지 않습니다.
현업이 필요한 데이터를 안정적으로 이용할 수 있도록 시스템 상태를 관리하고, 성능 문제의 원인을 찾아 개선하는 것이 중요합니다.
특히 대량 데이터를 다루는 DW 환경에서는 데이터 증가와 업무 변화에 따라 성능을 지속적으로 점검할 필요가 있습니다.
SQL 성능 개선의 핵심은 무조건 빠른 SQL을 만드는 것이 아니라, 필요한 데이터를 정확하고 효율적으로 처리하도록 만드는 것입니다.
함께 읽으면 좋은 글
[생활 속 금융 기술 #09] 카드 결제가 갑자기 안 되는 이유|금융 IT 담당자는 시스템 장애를 어떻게 찾아낼까?
금융 IT 운영담당자가 시스템 로그와 모니터링 지표를 활용해 장애를 분석하는 과정을 설명합니다.
[생활 속 금융 기술 #10] 50대 금융 IT 직장인의 AI 활용법|회의록·SQL·보고서 작성 시간을 줄이는 실전 노하우
생성형 AI를 SQL 분석과 문서 작성, 시스템 운영에 활용하는 방법을 알아봅니다.
[생활 속 금융 기술 #11] 챗GPT에 회사 자료를 올려도 될까?|금융 IT 직장인이 꼭 알아야 할 AI 보안 수칙 7가지
금융회사에서 AI를 사용할 때 지켜야 할 개인정보 보호와 정보보안 원칙을 살펴봅니다.
다음 글 예고
[생활 속 금융 기술 #13] 카드사 DW에는 어떤 데이터가 쌓일까?|승인·매입·청구 데이터가 분석 정보가 되는 과정
우리가 카드를 사용할 때 발생하는 승인 데이터는 어떤 과정을 거쳐 분석용 데이터로 활용될까요?
다음 글에서는 카드사의 승인·매입·청구 데이터를 중심으로 DW의 역할과 데이터 적재, 정합성 검증, 분석 정보 생성 과정을 쉽게 설명하겠습니다.