리타의 저장소

JAVA | DB Call 최소화 (Feat. PreparedStatement) 본문

Dev/Backend

JAVA | DB Call 최소화 (Feat. PreparedStatement)

ريتا 2025. 10. 11. 23:35
Java

 





SQLP를 공부하다 보니, Database 성능 튜닝의 3대 요소 중 하나에 DB Call 최소화가 있었다.

  • 데이터베이스 Call 최소화
    • Parse Call
    • Excute Call
    • Fetch Call

이와 관련해서 java단에서 Array Processing 기법으로 처리한다는 어떤 blog의 글을 읽고, 스터디원들에게 공유를 했었는데, DB call 관련해서 개발자의 입장에서 생각해봤을 때 어떤식으로 코드에서 사용될 수 있을 것 같냐는 추가 물음에 조금 더 생각을 해보기로 했다.
 


DB Call 최소화

 
결과적으로 Java에서도 DB 퍼포먼스 최적화에 대하여 고민을 할 수 밖에 없다.

  • Call을 줄인다는 관점에서..
용어성능에 미치는 영향최소화의 의미
Parse callSQL 문장을 파싱
(구문 분석)하는 단계
파싱은 CPU와 메모리 소모 → 불필요한 파싱 줄이면 속도 ↑같은 SQL을 재사용해서 DB가 매번 파싱하지 않도록 함
Execute callDB가 SQL 실행 명령을 받는 단계DB로 가는 요청 횟수 줄어듦 → 네트워크/IO 비용 ↓여러 쿼리를 batch로 묶어 한 번에 실행
Fetch call실행 결과를 가져오는 단계 (주로 select)DB에서 결과를 여러 번 나눠 보내는 걸 줄이면 전송 지연 ↓필요한 결과만 가져오거나, 여러 row를 한 번에 가져옴 (ex. fetch size 조정)
bulk insert에서는 직접적 관련은 적지만, batch select/insert에서는 줄일 수 있다

 
 

bulk insert / batch insert / array processing 기법들은 "parse call", "execute call"을 줄이기 위한 대표적인 최적화 방법.

 


 

1. Parse Call 최소화

  • SQL을 DB 서버에 보내면, 항상 "파싱(parse)" 단계가 필요하다.
  • SQL을 분석하고 실행 계획을 세워야 하니까.
  • 같은 SQL을 수십 번 보내면, 매번 parse call이 발생해서 서버 부하가 크다.
  • PreparedStatement 같은 걸 쓰는 이유
    • 한번만 SQL을 파싱하고
    • 그 뒤에는 바인딩 값만 바꿔서 다시 실행
    • ➡️ parse call을 1번으로 줄일 수 있다.

즉, batch insert / bulk insert는 SQL 문장 자체를 재사용하기 때문에 parse cost를 확 줄일 수 있다.


2. Execute Call 최소화

  • SQL을 DB에 보내서 실제 "명령을 수행"하는 걸 Execute Call이라고 한다.
  • 단일 insert를 1000번 하면 ➔ 1000번 Execute Call 발생
  • batch insert로 묶으면 ➔ 1~2번 Execute Call로 줄일 수 있음

batch insert나 bulk insert는 Execute Call 수를 대폭 줄이는 전략이다.


3. Fetch Call 최소화

  • Fetch Call은 select 결과를 가져오는 걸 의미한다.
  • insert는 fetch call과 직접적인 관련은 없다.
  • 하지만 대량 데이터 insert+select 같이 처리하는 경우라면
    • fetch size를 조정하거나
    • 결과를 한번에 많이 가져오는 방식으로 fetch call 최적화 가능.

주로 parse call / execute call 줄이는 게 핵심이다.
 


JAVA 에서 DB call 최소화를 위해 사용하는 방법 및 정리

구분batch insertbulk insertarray processing
Parse Call 줄이기PreparedStatement 재사용SQL 하나에 몰아넣음PreparedStatement 재사용
Execute Call 줄이기addBatch() 여러번 실행 후 한번 executeBatch()
addBatch() 통합 실행으로 네트워크 round-trip 최소화
SQL 한번만 보내고 끝배열 한꺼번에 보내서 한번 execute
Fetch Call직접적 관련은 거의 없음 (주로 select 최적화)  

 

* 추가 *
PreparedStatement 재사용 : SQL 재파싱 비용 줄임 + 커서 캐시 활용
Fetch size 조정 : 한번에 더 많은 row를 받아와서 왕복 횟수 줄임
IN 절로 병합 조회 : Parse/Excecute Call 줄입 (반복 호출 제거 - 서버 round-trp 횟수 최소화)

 
 
 

쿼리를 보내는 과정의 비용(통신, parse, execute)을 줄이면 퍼포먼스가 올라간다