DBMS는 클라이언트에게 데이터를 전송할때 일정량 나누어 전송하는데, 여기서 클라이언트가 매번 추가로 Fetch Call을 한다.
대용량 데이터를 부분범위 처리를 하면 빠르게 결과를 얻을 수 있다.
만약, 아래의 쿼리를 실행하면 데이터를 언제 볼 수 있을까?
select * from flow_user
이 쿼리로 얻는 데이터는 즉각적으로 결과를 받을 수 있다. 그 이유는 DBMS가 데이터를 모두 읽어 한번에 전송하지 않고, 일부 데이터 일정량(Array Size)을 전송하고 멈추기 때문이다.
(데이터를 전송하고 나면 서버 프로세스는 CPU를 OS에 반환하고 대기큐에서 잠을 잠.)
그다음 클라이언트로부터 Fetch Call을 받으면 다시 대기 큐에서 나와 일정량 전송한다.
이렇게 사용자로부터 Fetch Call이 있을때 데이터 일정량을 나누어 전송하는 것이 '부분범위 처리'
만약 아래의 쿼리는 언제 데이터를 볼 수 있을까?
select * from flow_user order by user_id
order by를 하면 user_id
로 sort 해야 결과를 받을 수 있기 때문에 이것은 "전체 범위 처리"이다.
Array Size는 전송해야 할 데이터량에 따라 조절해야한다.
쿼리툴에서 Array Size를 조절하는 옵션이 있다. 쿼리툴마다 다름.
책 164 page에 예시가 있는데, 책에서는 프레임워크에 다 구현되어있으니 가져다 쓰라고 한다.
OLTP는 'Online Transaction Processing'의 줄임말
쿼리 뒷쪽에 order by를 사용하여 부분처리를 유도하지 못한다면, 인덱스를 사용하여 order by를 생략해 부분 범위 처리를 유도할 수 있다.
-- 전체 범위 처리
select * from [user]
where reg_date between '2020-04-09' and '2020-04-10'
order by reg_date
-- 부분 범위 처리
select * from [user]
with(index(idx_reg_date))
where reg_date between '2020-04-09' and '2020-04-10'
-- 전체 범위 처리
select max(reg_date) from [user]
-- 부분 범위 처리
select top 1 reg_date
from [user] with(index(idx_reg_date))
전체 범위 처리는 전체를 처리하여 레포팅 하는 것에 적합하고 부분 범위 처리는 온라인으로 결과를 출력할때 즉, 반응이 빨라야 할때 사용하는 방법입니다.
부분 범위 처리가 전체 범위 처리 보다 시간이 더 오래 걸릴 수도 있으므로 용도에 맞게 써야 합니다.
출처 : https://devjino.tistory.com/105
배치 I/O는 읽는 블록마다 건건이 I/O Call을 발생시키는 비효율을 줄이기 위해 고안된 기능이다.