Array Processing 기능을 활용하면 한 번의 SQL 수행으로 다량의 로우를 동시에 insert/update/delete 할 수 있다. 이는 네트워크를 통한 데이터베이스 Call을 감소시켜주고, 궁극적으로 SQL 수행시간과 CPU 사용량을 획기적으로 줄여준다.
Array Processing 기능을 극대화하려면 연속된 일련의 처리과정이 모두 Array 단위로 진행돼야 한다. Array 단위로 수천 건씩 아무리 빠르게 Fetch 하더라도 다음 단계에서 수행할 insert가 건건이 처리된다면 그 효과가 크게 반감되며, 반대의 경우도 마찬가지다.
1. 부분범위처리 원리
쿼리 결과집합을 전송할 때, 전체 데이터를 쉼 없이 연속적으로 처리하지 않고 사용자로부터 Fetch Call이 있을 때마다 일정량씩 나누어서 전송하는 것을 '부분범위처리' 라고 한다.
네트워크를 통해 전송해야 할 데이터양에 따라 ArraySize를 조절할 필요가 있다.
예를 들어, 대량 데이터를 파일로 내려받는다면 어차피 전체 데이터를 전송해야 하므로 ArraySize를 크게 설정해야 한다. Arraysize를 조정한다고 해서 전송해야 할 총량이 변하지는 않지만, Fetch Call 횟수를 그만큼 줄일 수 있다.
반대로 앞쪽 일부 데이터만 Fetch하다가 멈추는 프로그램이라면 ArraySize를 작게 설정하는 것이 유리하다. 불필요하게 많은 데이터를 전송하고 버리는 비효율을 줄일 수 있기 때문이다.
2. OLTP 환경에서 부분범위처리에 의한 성능개선 원리
OLTP성 업무에서는 쿼리 결과 집합이 아주 많더라도 그 중 일부만 Fetch하고 멈출 때가 자주 있다. 따라서 출력 대상 건이 많을수록 Array를 빨리 채울 수 있어 쿼리 응답 속도도 그만큼 빨라진다.
3. ArraySize 조정에 의한 Fetch Call 감소 및 블록 I/O 감소
대량의 데이터를 내려받을 때, ArraySize를 크게 설정할수록 그만큼 Fetch Call 횟수가 줄어 네트워크 부하가 감소하고, 쿼리 성능이 향상된다. 그뿐만이 아니라 서버 프로세스가 읽어야할 블록 개수까지 줄어든다.
그러면 ArraySize를 조절하는데 왜 블록 I/O가 줄어들까?

ArraySize를 키운다고 해서 같은 비율로 Fetch Count와 Block I/O가 줄지는 않는다. 따라서 무작정 크게 설정한다고 좋은 것만은 아니며 일정 크기 기상이면 오히려 리소스만 낭비하게 된다.
클라이언트/서버 환경에서는 대용량 데이터를 조회할 때는 커서를 닫지 않은 채 사용자 이벤트가 발생할 때마다 결과 집합을 Fetch 하도록 구현할 수 있었다.
하지만, 웹 애플리케이션 환경에서는 커서를 계속 오픈한 채로 결과집합을 핸들링할 수 없다.
즉, 데이터베이스와의 연결을 지속하지 않는 웹 환경이기 때문에 사용자가 다음 페이지를 요청하거나 스크롤 바를 내릴 때마다 개별적인 SQL문을 수행하는 방식으로 페이지 처리를 구현해야 한다.
FetchSize를 늘리면 도움이 될까?
Fetch Count를 줄일 수 있지만 Array 버퍼에 쌓인 다량의 로우를 읽으면서 발생하는 CPU 리소스 낭비는 여전하고 메모리 사용량은 늘어난다.
해결책은, 페이지 처리를 서버 단에서 완료하고 최종적으로 출력할 레코드만 Fetch 하도록 프로그래밍하는 것이다.
페이지 처리를 하지 않았을 때 발생하는 부하 요인들
다량의 Fetch Call 발생 (SQL *Net eoundtrips to/from client)
대량의 결과 집합을 클라이언트로 전송하면서 발생하는 네트워크 부하
(bytes sent via SQL *Net to client)
대량의 데이터 블록을 읽으면서 발생하는 I/O 부하
AP 서버 및 웹 서버 리소스 사용량 증가
페이지 처리 하는법
페이지 단위로, 화면에서 필요한 만큼씩 Fetch Call
페이지 단위로, 화면에서 필요한 만큼씩 네트워크를 통해 전송
인덱스와 부분범위처리를 이용해 각 페이지에 필요한 최소량만 I/O
데이터를 소량씩 나누어 전송하므로 AP, 웹 서버 리소스 사용량 최소화
결론적으로, 조회할 때 데이터가 일정량 이상이고 수행빈도가 높다면 필수적으로 페이지 처리를 구현해야 한다.
페이지 처리의 목적
데이터베이스 Call 횟수 줄이기
네트워크를 통한 데이터 전송량 최소화
서버 내에서의 처리 일량 줄이기