3. 부분 범위 처리[인덱스 튜닝]

2022. 9. 19. 00:50개발 관련 책 읽기/친절한 SQL 튜닝

부분 범위 처리란 dbms가 클라이언트에게 데이터를 전송할 때 일정량씩 나누어 전송한다.

전체 결과 집합 중 아직 전송하지 않은 데이터가 많이 남아있어도 서버 프로세스는 클라이언트로부터 추가 Fetch Call을 받기 전까지 그대로 기다린다. OLTP(Online Transcation Processing) 환경에서 대용량 데이터를 빠르게 핸들링할 수 있는 아주 중요한 원리이다.

 

DBMS가 데이터를 모두 읽어 한 번에 전송하지 않고 먼저 읽는 데이터부터 일정량(ArraySize)을 전송하고 멈추기 때문이다.

 

<부분 범위 처리 과정 설명>

 

1. 일정량 데이터(ArraySize)를 전송 후 서버 프로세스는 CPU를 OS에 반환하고 대기 큐에서 Wait를 한다.

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

3. 1,2번 과정 반복

 

 

만약 쿼리 문예 정렬이 있다면 DBMS는 데이터를 다 읽어 정렬을 마치고 나서야 클라이언트에 데이터를 전송할 수 있다. (만약 해당 칼럼이 선두 인덱스라면 부분 범위 처리 가능 => 인덱스는 항상 정렬된 상태를 유지하므로 따로 정렬하지 않고 결과 집합을 바로 전송하면 됨)

=> "전체 범위 처리"

그림 1 - 대용량 데이터 처리 과정

 

위의 그림 1을 보면 대용량 테이블을 조회하는데 결괏값이 바로 나온다. 빨간색으로 표시한 곳을 보면 +100rows라고 표시되어 있는데 100개를 먼저 출력해서 보여주는 것이다. 전체 데이터를 읽는 것이 아니라 부분 범위 처리로 데이터를 보여주고 있다.

 

그림 2 - Fetch size 설정

 

위의 그림 2의 빨간색으로 표시된 부분을 보면 Fetch Size가 설정돼있는 것을 볼 수 있음 (디폴트 100으로 잡히네..)

따라서, 그림1처럼 100개씩 데이터가 보이게 되는 것이다.

 

반응형