본문 바로가기
SQLP Study/Database Call

06 페이지 처리의 중요성

by bash park 2020. 4. 12.

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서버 내에서 처리일량을 감소 
>> 조회할 데이터가 일정량 이상이고, 수행빈도가 높다면, 페이지 처리는 필수


댓글