Database/Oracle

[Oracle]DBMS_PARALLEL_EXECUTE 패키지

retto9522 2026. 4. 1. 17:20

DBMS_PARALLEL_EXECUTE

오라클의 DBMS_PARALLEL_EXECUTE 패키지는 병렬 처리를 쉽게 도와주는 오라클 내장 PL/SQL Package 오브젝트입니다. 대량 데이터를 처리할 때 병렬처리는 필수입니다. 따라서, 오라클이 기본으로 제공하는 패키지를 이용하여 병렬 처리를 보다 쉽게 사용할 수 있습니다.

 

오라클 데이터베이스의 병렬 처리 방법은 크게 2가지가 있습니다.

  1. 병렬 쿼리(Parallel Query)
  2. 애플리케이션 병렬(Application Parallel) 방식

1. 병렬 쿼리 방식

하나의 SQL 요청을 N개의 프로세스가 자동으로 나눠 처리하는 방법으로 오라클 데이터베이스의 사용자는 SQL 문장에 옵티마이저 힌트( /* parallel */ )를 추가함으로써 손쉽게 병렬 처리를 할 수 있습니다.

2. 애플리케이션 병렬 방식

사용자가 직접 작업 대상을 작은 단위의 그룹으로 나누고 N개의 SQL 문장을 동시에 요청하고 실행하는 방법. 해당 방식은 일반적으로 애플리케이션(C, JAVA, Python 등)으로 구현하기 때문에 병렬 쿼리에 비하면 처리가 복잡합니다. 

 

따라서, DBMS_PARALLEL_EXECUTE 패키지는 이 방식을 다른 프로그래밍 언어 없이 PL/SQL만으로 구현할 수 있는 패키지입니다.


DBMS_PARALELL_EXECUTE 처리 절차

1. 병렬 작업 생성 (Task 생성)

병렬 처리를 위한 작업(Task)을 생성합니다. 생성한 작업은 DBA_PARALLEL_EXECUTE_TASKS에서 자세한 정보를 조회할 수 있습니다.

# TASK 생성
BEGIN
	DBMS_PARALLEL_EXECUTE.CREATE_TASK(task_name=>'test');
END;
/

# 생성한 TASK 조회
SELECT * FROM DBA_PARALLEL_EXECUTE_TASKS;

 

2. 데이터 청크(Chunk) 생성

작업을 생성한 이후, 가장 중요한 청크(Chunk)를 생성합니다. 병렬 처리의 기본은 대량 데이터를 여러 개의 작은 데이터 그룹으로 나누고 동시에 처리하는 것입니다.

 

이때 나눠진 작은 단위의 데이터 그룹을 청크(Chunk)라고 합니다. 데이터 청크는 두 가지 방법으로 만들 수 있습니다.

2-1. ROWID 기준으로 청크 생성

테이블의 데이터를 ROWID를 기준으로 하여 작게 분할합니다. 아래 PL/SQL은 청크 하나에 약 1000개의 레코드가 포함되도록 분할합니다.

BEGIN
    DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_ROWID(task_name => 'test', table_owner => 'DATAWAY', table_name => 'T1', by_row => true, chunk_size=>1000);
END;
파라미터  설명
task_name CREATE_TASK 프로시저로 생성한 작업명
table_owner 청크 생성 대상 테이블 스키마
table_name 청크 생성 대상 테이블 이름
by_row True : 하나의 청크 크기가 chunk_size 파라미터에서 지정한 레코드 수가 되도록 청크를 분할함.
False : 하나의 청크 크기가 chunk_size 파라미터에서 지정한 블록 수가 되도록 청크를 분할함
chunk_size 청크의 크기를 지정함. by_row 파라미터의 값에 따라 의미가 다름

 

분할된 데이터 청크는 DBA_PARALLEL_EXECUTE_CHUNKS 뷰를 통해 자세한 정보와 이후의 병렬 작업 진행 상황을 모니터링 할 수 있습니다.

SELECT * FROM DBA_PARALLEL_EXECUTE_CHUNKS;

3. 병렬 작업 실행하기

청크를 생성한 후엔 작업(Task)을 실행합니다.

BEGIN
    DBMS_PARALLEL_EXECUTE.RUN_TASK(task_name =>'test', sql_stmt=>'begin test_procedure(:start_id, :end_id); end;', language_flag=>1, parallel_level=>8);
END;

 

파라미터 설명
sql_stmt SQL 또는 PL/SQL 문장을 입력합니다. 반드시 바인드 변수 :start_id, :end_id를 사용해야 합니다. 이 바인드 변수의 값은 분할된 각 청크의 시작과 끝을 나타내는 값입니다.
language_flag 1 or NATIVE 값을 사용합니다. 특별한 경우가 아니라면 이 값을 사용합니다.
parallel_level 입력한 수 만큼 동시에 여러 개의 청크(Chunk)를 대상으로 sql_stmt에서 입력한 쿼리를 실행합니다.

4. 병렬 작업 삭제하기

병렬 처리가 끝난 작업은 직접 삭제해야 합니다.

BEGIN
    DBMS_PARALLEL_EXECUTE.DROP_TASK(task_name =>'test');
END;

5. 병렬 작업 중지하기

작업 중지는 STOP_TASK 프로시저를 이용합니다.

BEGIN
    DBMS_PARALLEL_EXECUTE.STOP_TASK(task_name =>'test');
END;

 

작업 재시작은 RESUME_TASK 프로시저를 이용합니다.

BEGIN
    DBMS_PARALLEL_EXECUTE.RESUME_TASK(task_name =>'test');
END;