3.2 부분범위 처리 최소화
- DBMS가 클라이언트에게 데이터를 전송할 때도 일정량씩 나누어 전송
- 아직 전송할 분량이 남아도 서버 프로세스는 클라이언트로부터 추가 Fetch Call 을 받기 전까지 그대로 멈춰 서서 기다림
private void execute(Connection con) throws Exception {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select name from big_table");
for(int i=0; i<100; i++) {
if(rs.next()) System.out.println(rs.getString(1));
}
rs.close();
stmt.close();
}
위 코드가 1억건 짜리 table 이여도 빠르게 출력하는 이유는
DBMS가 데이터를 모두 읽어 한번에 전송하지 않고 먼저 읽는 데이터 일장량을 전송하고 멈추기 때문
-
데이터를 전송하고 나면 서버 프로세스는 CPU를 OS에 반환하고 대기큐에 잠
-
다음 Fetch Call 을 받으면 대기 큐에서 나와 그다음 데이터 일정량을 읽어 전송하고 다시 잠
- FetchCall 이 있을때마다 일정량 씩 나누어 전송하는 것을 부분범위 처리
-
JAVA 에서 Array Size 기본 값은 10
- 최초 rs.next() 호출시 Fetch Call 을 통해 DB 서버로 부터 전송 받은 데이터 10건을 클라이언트 캐시에 저장
- 이후 rs.next() 호출할 때는 Fetch Call 을 발생시키지 않고 캐시에서 데이터를 읽는다.
- 캐시에 저장한 데이터를 모두 소진한 상태에서 rs.next() 호출시 추가 Fetch Call 을 통해 10건 전송 받는다
- 100건을 다 읽을 때 까지 2~3과정 반복
정렬 조건이 있을때 부분처리
- order by 추가시
- DB 서버는 모든 데이터를 다 읽어 CREATED 순으로 정렬을 마치고서야 클라이언트에게 데이터 전송
- 즉 전체 범위 처리
- 데이터를 정렬 마친 후 일정량씩 나눠 클라이언트에게 데이터 전송
Array Size 를 통한 Fetch Call 최소화
- 대량 데이터 파일로 내려받는 다면 어차피 데이터를 모두 전송해야 하므로 가급적 그 값을 크게 설정
- FetchCall 횟수를 그만큼 줄일 수 있음
- 앞쪽 일부 데이터만 Fetch하다 멈추는 프로그램이면
OLTP 환경에서 부분 범위 처리에 의한 성능 개선 원리
- OLTP 란
- 온라인 트랜잭션 처리 시스템
- 소량 데이터를 읽고 갱신
OLTP성 업무에서 쿼리 결과 집합이 아주 많을때 사용자가 모든 데이터를 일일이 확인 하지 않음
- 특정한 상위 일부 데이터만 확인
- 인덱스와 부분처리 원리를 잘 활용하면 OLTP 환경에서 극적인 성능 개선 효과를 얻을 수 있음
멈출 수 있어야 의밍있는 부분범위 처리