권순용의 DB 이야기
병렬 프로세싱을 최적으로 이용하자. 2부. 0 2 99,999+

by axiom 병렬 프로세싱 PARALLEL FULL 병렬처리 [2013.06.30]


지난 강의에서 얘기한 것처럼 배치 작업을 빠르게 종료하기 위해서는 병렬 프로세싱이 반드시 필요하다. 그러나 병렬 프로세싱은 자원을 많이 사용할 수 있으므로 해당 시스템의 온라인 처리에 영향을 미칠 수 있다.

따라서 배치 처리를 위한 병렬 프로세싱의 사용은 매우 신중해야 한다. 지난 강의에 이어 병렬 프로세싱의 최적 이용에 대해 설명한다.

병렬 프로세싱의 효과적인 사용은 대용량 데이터를 처리하기 위해 매우 중요한 항목이다. 특히 데이터가 점점 증가하고 있는 지금 시점에서 병렬 프로세싱의 최적 사용은 필수로 여겨진다.

이제부터 병렬 프로세싱을 효과적으로 이용하는 방법을 함께 확인해 보자.

병렬 프로세싱을 효과적으로 이용하자

병렬 프로세싱을 이용하는 방법은 다양하다. 하지만 병렬 프로세싱을 이용하는 목적은 한 가지이다. 결국 대용량의 데이터를 빠르게 액세스하는 것이 주요 목적이다.

이와 같은 병렬 프로세싱의 효과적인 사용 사례를 확인함으로써 어떻게 사용해야 할지를 다시 한 번 생각해 보자.

첫 번째로 배치 조회 작업에서의 병렬 프로세싱 사용에 대해확인해 보자. 배치 조회 작업을 수행하는 것은 많은 데이터를 액세스하는 경우에 병렬 프로세싱을 고려하게 한다.

배치 조회 작업 중 적은 데이터를 액세스하는 경우에 이와 같은 방법을 사용한다면 더 큰 성능 저하를 발생시킬 수 있다. 다음의 예제를 확인해 보자.

SELECT A.카드번호, SUM(거래금액) 총거래액
  FROM 카드 A, 거래내역 B
 WHERE A.카드번호 = B.카드번호
 GROUP BY 카드번호;

이 예제는 카드 테이블과 거래내역 테이블을 조인해 카드번호별 총거래액을 추출하는 대용량 배치 조회 작업이라고 가정하자. 이와 같은 조인에서 성능 향상을 위해 고려해야 할 사항은 다음과 같다.

  • - 테이블 조인 방식
  • - 테이블 액세스 순서
  • - 병렬 프로세스 사용 유무

위와 같이 세 가지 항목을 고려해 SQL을 최적화하게 된다. 대용량의 테이블에 대한 조인 방식으로는 일반적으로 중첩 루프 조인보다는 해쉬 조인이 유리하므로 해쉬 조인 방식을 선택하게 된다. 그렇다면 테이블 액세스 순서는 어떻게 선정해야 하는가?

테이블 액세스 순서는 해쉬 조인의 경우 처리 범위가 더 작은 테이블을 먼저 액세스하고 처리 범위가 더 큰 테이블을 뒤에 액세스 해야만 원하는 성능을 보장받을 수 있을 것이다.

카드 테이블보다 거래내역 테이블의 크기가 더 크다고 가정한다면 카드 테이블이 먼저 액세스되고 거래내역 테이블이 뒤에 액세스되어야 성능을 보장 받을 수 있다.

결국, 해쉬 조인 방식을 사용해 카드 테이블을 먼저 액세스하고 거래내역 테이블을 뒤에 액세스하는 형태 의 조인을 이용해야 할 것이다. 그렇다면 여기서 해당 SQL의 최적화는 끝난 것인가?

대용량 테이블들의 조인이라면 이와 같이 최적화를 수행해도 원하는 성능을 보장 받기는 힘들 것이다. 그렇다면 어떻게 SQL을 최적화해야 하는가? 추가적으로 사용할 수 있는 방법이 병렬 프로세싱이다.

SELECT /*+ FULL(B) PARALLEL(B,4) */
       A.카드번호, SUM(거래금액) 총거래액
  FROM 카드 A, 거래내역 B
 WHERE A.카드번호 = B.카드번호
 GROUP BY 카드번호;

위와 같이 SQL을 수행한다면 거래내역 테이블을 액세스하는 순간 4개의 프로세스가 기동되어 수행되므로 하나의 프로세스로 데이터를 액세스하는 경우보다 더 빠른 수행 속도를 보장받을 수 있다.

그렇다고 1개의 프로세스를 이용하는 것보다 4배 빠르다고 말할 수는 없으며 상황에 따라서는 10배 이상 성능 향상이 될수도 있다.

그리고 거래내역 테이블에만 병렬 프로세싱을 이용할 수 있는 것은 아니며 카드 테이블도 병렬 프로세싱을 이용해 액세스할 수 있다.

예제에서 FULL(B) 힌트는 병렬 프로세싱을 사용할 경우 인덱스를 이용하면 안 되므로 거래내역 테이블을 명시적으로 테이블 전체 스캔으로 액세스하도록 힌트로 제어한 것이다.

두 번째로 클러스터 팩터 최적화를 위한 병렬 프로세싱의 사용을 확인해 보자. 클러스터 팩터는 액세스하고자 하는 데이터가 얼마만큼 모여 있는가를 의미한다.

그렇기 때문에 특정 컬럼으로 데이터를 정렬해 테이블에 저장한다면 정렬을 수행한 컬럼에 대 해 클러스터 팩터 최적화를 구현할 수 있다.

예를 들어, 클러스터 팩터 최적화를 수행하고자 하는 테이블은 거래내역 테이블이며 정렬을 수행해야 될 컬럼은 카드번호 컬럼이라고 가정하자.

또한, 거래내역 테이블은 거래일자 컬럼으로 구성된 범위 파티션(Range Partition) 테이블이라고 가정하자.

그렇다면 다음과 같은 방법을 통해 거래내역 테이블의 8월 데이터에 대해 카드번호 컬럼으로 클러스터 팩터를 최적화 할 수 있다.

ALTER SESSION ENABLE PARALLEL DML;

ALTER TABLE 거래내역_임시 NOLOGGING;


INSERT /*+ PARALLEL(B,4) */ 
  INTO 거래내역_임시 B
SELECT /*+ PARALLEL(A,4) */ *
  FORM 거래내역 A
 WHERE 거래일자 LIKE‘ 200808%’
 ORDER BY 카드번호;
 
 
ALTER TABLE 거래내역_임시 LOGGING;

-- 거래내역_임시 테이블에 인덱스 생성(Parallel 옵션 설정)
ALTER TABLE 거래내역 EXCHANGE PARTITION P_200808
 WITH 거래내역_임시
 INCLUDING INDEXES WITHOUT VALIDATION;

위와 같은 방법을 사용해 카드번호 컬럼으로 데이터를 정렬해 거래내역 테이블을 구성할 수 있다.

거래내역_임시 테이블을 거래내역 테이블과 동일한 구조의 테이블로 생성한 후 거래내역 테 이블의 2008년 8월 데이터를 카드번호 컬럼의 값으로 정렬해 거래내역_임시 테이블에 병렬 프로세싱을 이용해 데이터를 저장한다.

이와 같다면 거래내역_임시 테이블에는 2008년 8월 데이터가 카드번호 컬럼의 값으로 정렬되어 저장될 것이다. 이와 같이 거래내역_임시 테이블을 생성한 후 해당 테이블과 거래내역 테이블의 2008년 8월 파티션과 교체를 수행하게 된다.

물론, 교체를 수행하기 전에는 거래내역_임시 테이블에 필요한 인덱스를 모두 생성한 후에 파티션 교체를 수행한다면 거래내역_임시 테 이블의 인덱스도 거래내역 테이블의 인덱스와 교체된다.

이와 같이 병렬 프로세싱을 사용해 우리는 클러스터 팩터를 최적화할 수 있을 것이다. 대용량 테이블에 대해서 클러스터 팩터 최적화는 반드시 필요하며 이와 같은 경우 파티션 아키텍처와 병렬 프로세싱 아키텍처를 이용해야만 빠른 속도로 클러스터 팩터 최적화를 수행할 수 있다.

병렬 프로세싱은 대용량의 데이터를 액세스하는 작업에서 탁 월한 성능을 보장하게 된다. 하지만, 내부적인 아키텍처를 모르 고 사용한다면 많은 문제를 발생시킬 수도 있다.

어떤 아키텍처든지 최적으로 사용했을 때 빛을 낼 수 있을 것이다. 병렬 프로세싱은 사용자의 정확한 분석 하에 사용해야만 병렬 프로세싱의 무한한 힘을 느낄 수 있다.

참고링크

- 강좌 URL : http://www.gurubee.net/lecture/2277

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 아발란체 [2013.07.02 15:25:35]

보물 같은 자료~ !


by 참된신자 [2014.08.11 08:56:21]

감사합니다 :)

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입