5. 다중처리(Array Processing)의 활용

  • 다중처리란 오떤 오퍼레이션이 실행될 때 한번 DBMS를 호출할때마다 여러 건을 처리하도록 하여 DBMS의 호출 횟수를 줄임으로써 시스템 오버헤드를 감소시키는 것이다.
  • 이 개념은 온라인,배치(Batch),보고서(Report)프로그램 등 거의 모든 유형의 복수건의 데이터를 처리하는 경우에 적용하여 수행속도를 향상시킬 수 있다.
  • 운반단위=다중처리의 단위

5.1 다중처리의 개념

100개의 로우를 처리하는 것이나 한번에 1,000개의 로우를 처리하는 것은 전체적인 일량으로 볼 때 동일하다.
그러나 연속 작업 측면에서 보면 한 번 호출할 때마다 처리하는 양은 후자가 10배가 많다.

출처 : 이화식(대용량데이터베이스솔루션)

  • 다중처리 방법을 적절히 활용하면 수행속도의 향상뿐만 아니라 애플리케이션을 작성한 코딩양도 1/10이하로 줄일 수 있고 유지,보수나 튜닝도 아주 간편해진다.
  • 다중처리의 단위는 프로그램의 성격,시스템의 자원 상태,처리하고자 하는 일의 성격에 따라 달라질 수 있다.

5.2 유형별 다중처리 방법

가. SQL*Plus 와 SQL*Loader

  • SQL*Plus : Default 다중처리 운반단위는 15

변경방법 => SET ARRAYSIZE 100

SQL처리를 위한 버퍼의 크기는 Default 6,000 byte. 이 버퍼는 출력되는 로우를 담는 버퍼이므오 'SELECT'를 수행시킨 경우에만 해당된다.

  • SQL*Loader : Default로 64개의 레코드씩 다중처리.

변경방법 => 'ROWS=','BINDSIZE=' 옵션을 이용한다.

나. 온라인형 개발 툴

  • SQL*Forms
  • ORACLE*Forms

출처 : 이화식(대용량데이터베이스솔루션)

운반단위 10만큼만 추출하여 프로그램의 메모리 버퍼에 저장하고 동시에 이 값들을 화면에 출력시킨다.
사용자가 화면을 아래로 NEXT SCROLL 을 수행시키면 그 다음 운반단위 만큼을 추출하여 기존의 버퍼에 저장된 내용에 추가하여(Append) 저장하고 화면에 출력한다.
PREVIOUS SCROLL 을 수행시키면 이미 버퍼에 저장되어 있던 레코드들을 다시 화면에 출력한다.

다. 배치형 개발 툴

하나의 변수명에 복수개의 데이터로 구성된 집합을 담는다.
데이타 가공은 'DECODE'를 사용한다.

View,Inline View

(1) HOST 변수의 선언과 SQL문에서의 사용


EXEC SQL BEGIN DECLARE SECTION;
 char emp_name\[50\]\[20\];
 int emp_num\[50\];
 float emp_sal\[50\];
EXEC SQL END DECLARE SECTION;

(2) HOST 변수로 추출(SELECT)


EXEC SQL DECLARE sel_cur FOR
 SELECT empno,ename,sal
 FROM EMP
 WHERE empno>7000;
EXEC SQL OPEN sel_cur;
num_ret=0;
end_flag=1;
for(;end_flag>0; )
{ ?? EXEC SQL FETCH sel_cur INTO :emp_name,:emp_number,:salary; ?? ?
  if(sqlca.sqlcode==1403) end_flag=0;  ??? 더 이상 Fetch 할 로우가 없을때 or 운반단위를 모두 채우지 못했을때 1403 ?? ? 
  if((sqlca.sqlerrd\[2\]-num_ret)>0)?? FETCH된 로우 수. ?? ?... ?? ? num_ret=sqlca.sqlerrd\[2\]; ?}
EXEC SQL CLOSE sel_cur;

(3) INSERT,UPDATE,DELETE의 다중처리

  • FOR 의 사용

EXEC SQL FOR :loop_cnt
 UPDATE EMP
 SET SAL=:salary*1.12
 WHERE empno=:emp_number

  • 다중처리로 INSERT

for(i=0;i<50;i++)
{ ?? strcpy(emp_name\[i\],'...'); ?? emp_number\[i\]=...; ?? salary\[i\]=...; }
EXEC SQL INSERT INTO EMP(ename,empno,sal)
VALUES(:emp_name,:emp_number,:salary);
EXEC SQL INSER INTO EMP(ename,empno,sal)
 SELECT :emp_name,:emp_number,:salary
 FROM dual
\\
 WHERE ... conditions...

  • 다중처리로 UPDATE

EXEC SQL UPDATE EMP
 SET SAL = :salary
 WHERE EMPNO = :emp_number

  • 다중처리로 DELETE

EXEC SQL DELETE FROM EMP
 WHERE EMPNO = :emp_number;


(4)배열 변수의 참조

(5)기타 툴의 다중처리
SQL_TRACE

문서에 대하여

  • 최초작성자 :VLDB:손소희
  • 최초작성일 : 2007년 10월 5일
  • 이 문서는 오라클클럽 대용량 데이터베이스 스터디 모임에서 작성하였습니다.
  • {*}이 문서의 내용은 이화식님의 대용량 데이터베이스 솔루션1 을 참고했습니다.*