3.2 부분범위 처리 최소화

임종혁·2024년 12월 24일

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

  1. 최초 rs.next() 호출시 Fetch Call 을 통해 DB 서버로 부터 전송 받은 데이터 10건을 클라이언트 캐시에 저장
  2. 이후 rs.next() 호출할 때는 Fetch Call 을 발생시키지 않고 캐시에서 데이터를 읽는다.
  3. 캐시에 저장한 데이터를 모두 소진한 상태에서 rs.next() 호출시 추가 Fetch Call 을 통해 10건 전송 받는다
  4. 100건을 다 읽을 때 까지 2~3과정 반복

정렬 조건이 있을때 부분처리


  • order by 추가시
    • DB 서버는 모든 데이터를 다 읽어 CREATED 순으로 정렬을 마치고서야 클라이언트에게 데이터 전송
    • 즉 전체 범위 처리
    • 데이터를 정렬 마친 후 일정량씩 나눠 클라이언트에게 데이터 전송

Array Size 를 통한 Fetch Call 최소화


  • 대량 데이터 파일로 내려받는 다면 어차피 데이터를 모두 전송해야 하므로 가급적 그 값을 크게 설정
    • FetchCall 횟수를 그만큼 줄일 수 있음
  • 앞쪽 일부 데이터만 Fetch하다 멈추는 프로그램이면
    • Array Size 작게 설정

OLTP 환경에서 부분 범위 처리에 의한 성능 개선 원리


  • OLTP 란
    • 온라인 트랜잭션 처리 시스템
    • 소량 데이터를 읽고 갱신

OLTP성 업무에서 쿼리 결과 집합이 아주 많을때 사용자가 모든 데이터를 일일이 확인 하지 않음

  • 특정한 상위 일부 데이터만 확인
  • 인덱스와 부분처리 원리를 잘 활용하면 OLTP 환경에서 극적인 성능 개선 효과를 얻을 수 있음

멈출 수 있어야 의밍있는 부분범위 처리


  • 앞쪽 일부만 출력하고 멈출수 있는가

0개의 댓글