06 페이지 처리의 중요성
# Database서버에 직접 연결되어 있는 클라이언트 서버(Orange, Toad, Client Tool 등..)에서는 한번 오픈한 커서를
닫지 않고, 사용자 이벤트(스크롤 내려 다음행 보기 같은..)발생시 결과집합을 Array size 만큼 Fetch 할수 있는
기능이 있다.
# 웹 어플리케이션 환경에서는 데이터베이스와 연결을 지속적으로 하지 않기 때문에 커서를 계속 열어 놓고 Fetch를
할수 가 없다. 즉, 시용자가 다음 페이지를 요청하거나 스크롤 바를 내릴 때마다 개별적인 SQL문을 수행하는
방식으로 페이지 처리를 구현해야 한다. 그러다보니 페이지 처리구현 방식이 자주 이슈가되곤 한다.
# 하기 코드 해설 및 개선 방안
>> 각 로우의 데이터를 계속 Fetch 하다가 출력 해야 할 페이지(pageNo)에 도딜하면 그때부터
printRow를 호출해 pageSize 개 수만큼 로우를 출력하고. 그제야 Fetch를 멈춘다.
>> 뒷번호 페이지일수록 Fetch Call 횟수가 증가된다.
>> Fetch size를 늘리면 해결방법이 되지않나?
>> 반복되어 불필요한 작은 사이즈의 데이터 Fetch count는 줄어들수 있으나,
Client 서버의 Array buffer에 쌓인 다량의 로우를 읽는데 발생하는
Client 서버의 CPU리소스 낭비와 메모리 사용량은 커질것이다.
또 10페이지를 출력하려면 1페이지부터 10페이지까지 모든 데이터를 Fetch 해 불필요하게 많는 로우를
가져와야 함으로 서버 또는 네트워크의 부하가 가중될수 있다.
>> 유일한 해결책은 페이지 처리를 서버단에서 완료하고, 최종적으로 출력할 레코드만, Fetch 하도록 프로그램을
설계하는것이다.
---------------------------------------------------------------------------------------------------------------------------------
void pagination ( ResultSet rs , long pageNo , int pageSize ) throws Exception (
int i = 0
while( rs.next() ) { --fetch 계속 발생
if (++i > (pageNo-1) * pageSize ) printRow(rs) ;
if (i == pageNo * pageSize ) break;
}
}
i := 0 ;
loop
fetch c into l_record;
exit when ( c%notfound or (i = pageNo * pageSize)) ;
i := i + 1;
if i > (pageNo-1)*pageSize then
printRow (l_record);
end if;
end loop ;
---------------------------------------------------------------------------------------------------------------------------------
# 페이지 처리
>> 페이지 처리를 하지 않았을 때 발생하는 문제점
- 대량의 fetch call 발생
- 대량의 결과집합을 클라이언트로 전송하면서 발생하는 네트워크 부하
- 대량의 데이터블록을 읽으면서 발생하는 I/O부하
- 클라이언트 서버(=AP서버, 웹서버) 리소스 사용량 증가
>> 페이지 처리를 수행했을 때 개선되는점
- 페이지 단위로, 화면에서 필요한 만큼 Fetch Call
- 페이지 단위로, 화면에서 필요한 만큼 네트워크 전송
- 인덱스와 부분범위 처리를 이용해 각페이지에서 필요한 최소량만 I/O
- 데이터를 소량씩 나누어 전송하므로 클라이언스 서버 리소스 사용량이 줄어듬
>> 페이지처리의 목적
- 데이터베이스 Call 횟수 감소
- 네트워크를 통한 데이터 전송량 감소.
- DB서버 내에서 처리일량을 감소
>> 조회할 데이터가 일정량 이상이고, 수행빈도가 높다면, 페이지 처리는 필수
'SQLP Study > Database Call' 카테고리의 다른 글
08 PL/SQL 함수 호출 부하 해소방안 (0) | 2020.04.12 |
---|---|
07 PL/SQL 함수의 특징과 성능부하 (0) | 2020.04.12 |
05 Fetch Call 최소화 (0) | 2020.04.12 |
04 Array Processing 활용 (0) | 2020.04.12 |
03 데이터베이스 Call이 성능에 미치는 영향 (0) | 2020.04.12 |
댓글