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

by axiom 병렬 프로세싱 PARALLEL QC Pn 프로세스 큐 병렬처리 [2013.06.26]


배치 전용 시스템과 온라인 전용 시스템이 분리되던 시대가 있었지만, 지금은 많은 시스템들이 온라인 처리와 배치 처리를 동시에 수행하고 있다. 이와 같은 시스템에서 중요한 사항은 무엇인가? 배치 작업이 온라인에 영향을 미치지 않으면서 빠르게 수행되어야 하는 것이 중요한 사항일 것이다.

이와 같은 배치작업을 빠르게 종료하기 위해서는 병렬 프로세싱이 반드시 필요하다. 하지만, 병렬 프로세싱은 자원을 많이 사용할 수 있으므로 해당 시스템의 온라인 처리에 영향을 미칠 수 있다. 따라서 배치 처리를 위한 병렬 프로세싱의 사용은 매우 신중하게 사용해야 한다.

병렬 프로세싱이야말로 대용량 데이터베이스의 성능을 향상시킬 수 있는 방법 중 가장 효과적인 방법이라고 말해도 과언이 아니다. 그 만큼 매우 효과적으로 대용량 데이터를 액세스할 수 있다는 의미다.

하지만, 잘못 사용된 병렬 프로세싱은 엄청난 문제를 발생시킬 수 있다. 그렇기 때문에 이와 같은 병렬 프로세싱의 내부 아키텍처와 여러 사례를 바탕으로 정확한 병렬 프로세싱을 이용해야 할 것이다.

참고로 병렬 프로세싱은 데이터베이스마다 구현 방법이 상이하므로 여기서는 오라클을 기준으로 설명한다.

병렬 프로세싱의 내부 아키텍처를 이해하자

병렬 프로세싱은 여러 개의 프로세스를 기동시켜 SQL을 수행하는 것이다. 그렇기 때문에 내부적으로 복잡한 수행을 하게 된다. 병렬 프로세싱의 내부 아키텍처에 대해 아래 SQL을 통해 확인해 보자.

SELECT /*+ PARALLEL(A,2) */
        판매일자, 고객명, 상품이름, 제조사
  FROM 판매 A
 WHERE 판매자_이름 LIKE '이%';

위와 같이 SQL을 수행한다면 병렬 프로세싱은 어떻게 수행되겠는가? SQL의 힌트에 의해 A 테이블인 판매 테이블을 액세스하기 위해 2개의 프로세스가 기동하게 된다.

2개의 프로세스가 기동되면 2개의 프로세스는 판매 테이블에서 액세스해야 하는 데이터를 2개로 분리해 분리된 2개의 데이터에 대해 하나씩 액세스하게 된다.

이와 같이 2개의 프로세스에 의해 액세스된 각각의 데이터는 액세스가 종료된 후에 해당 SQL을 수행한 프로세스에게 그 결과를 제공하게 되며 해당 SQL을 수행한 프로세스는 그 결과를 취합해 최종 결과를 화면에 추출하게 된다.

  • [그림1] 예제 SQL의 수행 과정
  • 예제 SQL의 수행 과정

위의 병렬 프로세싱 수행은 그렇게 어렵지만은 않을 것이다. 해당 SQL은 [그림 1]과 같은 구조를 이용해 결과를 추출하게된다. 위의 수행 구조에 대해 확인해 보자.

  • - QC(Query Codinator) : 작업을 분배해주고 결과를 취합하는 역할을 수행
  • - Pn : 병렬 프로세스를 의미(슬레이브 프로세스)
  • - 프로세스 큐 : 각각의 병렬 프로세스가 메시지를 주고받기 위해 사용하는 큐

위와 같은 요소들에 의해 병렬 프로세싱은 수행된다. 2개의 병렬 프로세스를 수행하게 되면 내부적으로 2개의 병렬 프로세스가 기동되며 각각의 프로세스는 디스크로부터 2개로 분리된 데이터를 각각 액세스하게 된다.

이와 같은 구조를 가지기 때문에 하나의 프로세스로 작업을 수행하는 것에 비해 더 빠른 성능을 보장받을 수 있다. 병렬 프로세스를 여러 개 기동시킨다고 프로세스의 개수에 비례해 성능이 향상되지는 않으며 디스크의 속도및 기타 항목에 따라 성능은 좌우될 것이다.

이와 같은 아키텍처를 가지고 있기 때문에 빠른 성능을 보장하게 되며 여러 개의 프로세스를 기동한다는 점을 제외하고 다음과 같은 요소에 의해 성능은 더욱 향상될 것이다.

  • - Direct Read/Write

Direct Read/Write는 액세스를 원하는 테이블의 데이터에 대해 메모리로 적재해 액세스하는 것이 아니라 메모리에 적재하지 않고 바로 데이터를 디스크에서 액세스하는 것이다. 그림에서처럼 병렬 프로세스들은 디스크에서 데이터를 액세스하게 되고 메모리를 액세스하지 않게 된다.

이와 같은 방법을 사용하는 것은 전체 데이터를 액세스하기 때문에 유리한 것이며 일반적으로 몇 건의 데이터만을 반복적으로 액세스하는 온라인의 경우에 이와같은 방법을 사용한다면 성능은 저하된다.

메모리에 데이터를 적재해 놓고 메모리만을 액세스하는 것이 온라인에서는 더욱 유리하기 때문이다.

정렬과 병렬 프로세싱을 이해하자

병렬 프로세싱에서 ORDER BY 절 또는 GROUP BY 절 등을 사용한다면 어떻게 수행될까? GROUP BY 절 또는 ORDER BY 절이 존재한다면 기존에 수행되는 방법과는 약간의 차이가 발생하게 된다.

[그림 2]를 통해 확인해 보자. GROUP BY 절 또는 ORDER BY 절을 사용했다면 [그림 2]와 같이 수행되며 여기서 특이 사항에 대해서만 확인해 보자. 해당 수행은 병렬 프로세싱을 2개로 설정한 경우이다. 하지만, 실제로는 P0부터 P4까지 4개의 프로세스가 기동된다.

해당 SQL에서 2개의 프로세스를 설정했음에도 불구하고 왜 4개의 프로세스가 기동하는 것일까? 이는 병렬 프로세싱이 정렬에 대한 작업을 별도로 수행한다는 것을 의미한다.

  • [그림2] GROUP BY 절 또는 ORDER BY 절의 사용
  • GROUP BY 절 또는 ORDER BY 절의 사용

설정과 같이 2개의 프로세스에 의해 테이블을 액세스하게 되고 나머지 2개의 프로세스는 테이블을 액세스한 각각의 데이터에 대해 정렬을 수행하게 된다.

정렬을 수행한 각각의 데이터를 SQL을 실행한 프로세스에서 취합해 결과를 추출하게 된다. 이와 같은 과정을 수행해 ORDER BY 절 또는 GROUP BY 절에 대한 병렬 프로세싱을 수행하게 된다.

병렬 프로세싱의 수행 과정에서 무엇을 알 수 있겠는가?

병렬 프로세싱의 수행 과정을 통해 정확한 병렬 프로세싱을 이해하는 것은 좀 더 정확하게 병렬 프로세싱을 사용할 수 있게 해줄 것이다. 다음 강좌에는 병렬 프로세싱의 활용에 대해 확인해보자.

참고링크

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

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

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

by 짜리몽땅 [2013.06.27 12:53:44]

좋은 내용이네요..
DBA이든 개발자든, 역시 인터널 로직을 이해하고
알맞게 sql 사용해야 좋은 성능을 볼 수 있는듯 하네요.


by 아발란체 [2013.06.28 13:16:25]
좋은글 감사합니다 ~ !

by 암드 [2013.11.21 10:13:48]

좋은 강의 감사합니다.

by 참된신자 [2014.08.08 10:23:56]

감사합니다 :)

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