3.2 부분 범위 처리 활용

개발자 로그·2021년 6월 7일
0

친절한SQL튜닝

목록 보기
9/15
post-thumbnail

부분 범위 처리

전체 쿼리 집합을 쉼없이 연속적으로 전송하지 않고 사용자로부터 Fetch Call이 있을 때마다 일정량씩 나누어 전송하는 것

상세

DBMS가 클라이언트에게 데이터를 전송할 때 먼저 읽은 데이터부터 일정량을 전송하고 멈춤.

데이터를 전송하고 나면 서버 프로세스는 CPU를 OS에 반환하고 대기 큐에서 잠을 잠.

다음 Fetch Call을 받으면 대기 큐에서 나와 그 다음 데이터 부터 일정량을 읽어서 전송하고 또 다시 잠듬

데이터를 전송하는 단위인 Array Size는 클라이언트 프로그램에서 설정한다. JAVA에서 Array Size기본값은 10이며, Statement 객체 setFetchSize 메소드를 통해 설정을 변경할 수 있다.

⇒ 상세 메커니즘

  1. 최초 rs.next() 호출 시 Fetch Call을 통해 DB 서버로부터 전송받은 데이터 10건을 클라이언트 캐시에 저장
  2. 이후 rs.next() 호출할 때는 Fetch Call을 발생시키지 않고 캐시에서 데이터를 읽음
  3. 캐시에 저장한 데이터를 모두 소진한 상태에서 rs.next() 호출 시 추가 Fetch Call을 통해 10건을 전송받음
  4. 100건을 다 읽을 때까지 2~3번의 과정을 반복함
  • 정렬 조건이 선두에 있는 인덱스가 있는 경우에는 부분범위 처리가 가능하지만 , 없다면 불가능하다.
  • Fetch Size 최소화를 위해 Array Size를 크게 조정할 수 있지만, 앞쪽 일부 데이터만 필요한 경우에는 Array Size를 작게 설정하는 것이 유리하다.

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

OLTP(Online Transaction Processing) ⇒ 온라인 트랜잭션을 처리하는 시스템

  • 일반적으로는 소량 데이터를 읽고 갱신

  • 대량데이터를 조회하는 경우도 있으며, 이때 인덱스와 부분범위 처리 원리를 잘 활용하면 OLTP환경에서 극적인 성능개선 효과를 얻을 수 있다

    ex ) 조건문에 사용할 컬럼과 order by절의 컬럼으로 인덱스를 구성하면 Sort Order By 오퍼레이션을 생략할 수 있다.

앞쪽 일부만 출력하고 멈출 수 있어야 한다

profile
성장하는 개발자

0개의 댓글

관련 채용 정보