가. 배치 프로그램이란
일반적으로 배치(Batch) 프로그램이라 하면, 일련의 작업들을 하나의 작업 단위로 묶어 연속적으로 일괄 처리하는 것을 말한다. 온라인 프로그램에서도 여러 작업을 묶어 처리하는 경우가 있으므로 이와 구분하려면 한 가지 특징을 더 추가해야 하는데, 사용자와의 상호작용(Interaction) 여부다.
사용자와의 상호작용 없이
대량의 데이터를 처리하는
일련의 작업들을 묶어
정기적으로 반복 수행하거나
정해진 규칙에 따라 자동으로 수행
정기 배치 : 정해진 시점(주로 야간)에 실행
이벤트성 배치 : 사전에 정의해 둔 조건이 충족되면 자동으로 실행
On-Demand 배치 : 사용자의 명시적인 요구가 있을 때마다 실행
나. 배치 환경의 변화
과거 :
현재 :
다. 성능 개선 목표 설정
라.배치 프로그램 구현 패턴과 튜닝 방안
절차형으로 작성된 프로그램 : 애플리케이션 커서를 열고, 루프 내에서 또 다른 SQL이나 서브 프로시저를 호출하면서 같은 처리를 반복하는 형태
One SQL 위주 프로그램 : One SQL로 구성하거나, 집합적으로 정의된 여러 SQL을 단계적으로 실행
구분 | 설명 |
---|---|
절차형으로 작성된 프로그램 | 병목을 일으키는 SQL 을 찾아 I/O 튜닝 : 인덱스를 재구성하고 엑세스 경로 최적화 프로그램 Parallel 활용 : 메인 SQL 읽은 데이터 범위를 달리하여 프로그램을 동시에 활용 Array Processing 을 활용 One SQL 위주로 프로그램을 다시 구현 |
One SQL 위주 프로그램으로 구현 | 병목을 일으키는 오퍼레이션을 찾아 I/O 튜닝 index scan 보다는 full table scan 방식으로 처리 NL Join 보다는 Hash Join 으로 처리 임시 테이블 활용, 파티셔닝 활용, 병렬처리 사용 |
-- ORACLE --
select /*+ full(o) parallel(o, 4) */ count(*) 주문건수, sum(주문수량) 주문수량, sum(주문금액) 주문금액
from 주문 o
where 주문일시 between '20100101' and '20101231';
select /*+ index_ffs(o, 주문_idx)) parallel_index(o, 주문_idx, 4) */ count(*) 주문건수
from 주문 o
where 주문일시 between '20100101' and '20101231'
-- parallel 힌트를 사용할 때는 반드시 Full 힌트도 함께 사용하는 습관이 필요하다.
-- 옵티마이저에 의해 인덱스 스캔이 선택되면 parallel 힌트가 무시되기 때문이다.
-- parallel_index 힌트를 사용할 때, 반드시 index 또는 index_ffs 힌트를 함께 사용하는 습관도 필요하다.
-- 옵티마이저에 의해 Full Table Scan이 선택되면 parallel_index 힌트가 무시되기 때문이다.
-- SQL Server --
select count(*) 주문건수
from 주문
where 주문일시 between '20100101' and '20101231' option (MAXDOP 4)
select /*+ full(고객) parallel(고객 4) */ * from 고객 order by 고객명
select /*+ ordered use_hash(e) full(d) noparallel(d) full(e) parallel(e 2) pq_distribute(e broadcast none) */ *
from dept d, emp e
where d.deptno = e.deptno
order by e.ename
/*+ pq_distribute(inner, none, none) */
/*+ pq_distribute(inner, partition, none) */
/*+ pq_distribute(inner, none, partition) */
/*+ pq_distribute(inner, hash, hash) */
/*+ pq_distribute(inner, broadcast, none) */
/*+ pq_distribute(inner, none, broadcast) */
SQL> INSERT /*+ APPEND */ INTO 상품기본이력 ( ... )
2 SELECT /*+ PARALLEL(A,32) PARALLEL(B,32) PARALLEL(C,32) PARALLEL(D,32) */ ......
3 FROM 상품기본이력임시 a, 상품 b, 코드상세 c, 상품상세 d
4 WHERE a.상품번호= b.상품번호
5 AND ...
6 /
INSERT /*+ append */ INTO 상품기본이력 ( *
1행에 오류:
ORA-12801: 병렬 질의 서버 P013에 오류신호가 발생했습니다
ORA-01652: 256(으)로 테이블 공간 TEMP에서 임시 세그먼트를 확장할 수 없습니다
경 과: 01:39:56.08
-------------------------------------------------------------------------------
| Operation | Name | Rows | Pstart | Pstop |IN-OUT | PQ Distrib|
| ------------------------------------------------------------------------------
| INSERT STATEMENT | | 5248 | | | | |
| LOAD AS SELECT | | | | | | |
| HASH JOIN | | 5248 | | | P->S | QC (RAND) |
| HASH JOIN OUTER | | 5248 | | | P->P | BROADCAST |
| HASH JOIN | | 5248 | | | PCWP | |
| PARTITION HASH ALL | | | 1 | 128 | PCWP | |
| TABLE ACCESS FULL | 임시 | 5248 | 1 | 128 | P->P | BROADCAST |
| TABLE ACCESS FULL | 상품 | 7595K| | | PCWP | |
| TABLE ACCESS FULL | 코드 | 26 | | | P->P | BROADCAST |
| TABLE ACCESS FULL | 상세 | 7772K| | | PCWP | |
--------------------------------------------------------------------------------
SQL> INSERT /*+ APPEND */ INTO 상품기본이력 ( ... )
2 SELECT /*+ ORDERED PARALLEL(A,16) PARALLEL(B,16) PARALLEL(C,16) PARALLEL(D,16)
3 PQ_DISTRIBUTE(B, NONE, PARTITION)
4 PQ_DISTRIBUTE(C, NONE, BROADCAST)
5 PQ_DISTRIBUTE(D, HASH, HASH) */ ......
6 FROM 상품기본이력임시 a, 상품 b, 코드상세 c, 상품상세 d
7 WHERE a.상품번호= b.상품번호
8 AND ...
9 /
8796902 개의 행이 만들어졌습니다.
경 과: 00:02:29.00
-------------------------------------------------------------------------------
| Operation | Name | Rows | Pstart | Pstop |IN-OUT | PQ Distrib |
-------------------------------------------------------------------------------
| INSERT STATEMENT | | 5248 | | | | |
| LOAD AS SELECT | | | | | | |
| HASH JOIN | | 5248 | | | P->S | QC (RAND) |
| HASH JOIN OUTER | | 5248 | | | P->P | HASH |
| HASH JOIN | | 5248 | | | PCWP | |
| PARTITION HASH ALL | | | 1 | 128 | PCWP | |
| TABLE ACCESS FULL | 임시 | 5248 | 1 | 128 | PCWP | |
| TABLE ACCESS FULL | 상품 | 7595K| | | P->P | PART (KEY) |
| TABLE ACCESS FULL | 코드 | 26 | | | P->P | BROADCAST |
| TABLE ACCESS FULL | 상세 | 7772K| | | P->P | HASH |
-------------------------------------------------------------------------------