SQLP를 공부하다 보니, Database 성능 튜닝의 3대 요소 중 하나에 DB Call 최소화가 있었다.
데이터베이스 Call 최소화
Parse Call
Excute Call
Fetch Call
이와 관련해서 java단에서 Array Processing 기법으로 처리한다는 어떤 blog의 글을 읽고, 스터디원들에게 공유를 했었는데, DB call 관련해서 개발자의 입장에서 생각해봤을 때 어떤식으로 코드에서 사용될 수 있을 것 같냐는 추가 물음에 조금 더 생각을 해보기로 했다.
DB Call 최소화
결과적으로 Java에서도 DB 퍼포먼스 최적화에 대하여 고민을 할 수 밖에 없다.
Call을 줄인다는 관점에서..
용어
뜻
성능에 미치는 영향
최소화의 의미
Parse call
SQL 문장을 파싱 (구문 분석)하는 단계
파싱은 CPU와 메모리 소모 → 불필요한 파싱 줄이면 속도 ↑
같은 SQL을 재사용해서 DB가 매번 파싱하지 않도록 함
Execute call
DB가 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 insert
bulk insert
array 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)을 줄이면 퍼포먼스가 올라간다