오라클 DBMS_PARALLEL_EXECUTE 패키지 사용법을 소개합니다. 이 패키지는 병렬 처리를 쉽게 도와주는 오라클 내장 PL/SQL Package 오브젝트입니다. 대량 데이터를 처리할 때 병렬(Parallel) 처리는 선택이 아닌 필수입니다. 오라클이 기본으로 제공하는 패키지를 이용하여 병렬 처리를 보다 쉽게 사용해보세요.
오라클 데이터베이스의 병렬(Parallel) 처리 방법은 크게 2가지입니다. 바로 병렬 쿼리(Parallel Query)와 애플리케이션 병렬(Application Parallel) 방식입니다. 이 글에서 설명하는 DBMS_PARALLEL_EXECUTE 패키지는 애플리케이션 병렬(Application Parallel) 방식을 쉽게 구현하는 방법입니다.
병렬 쿼리(Parallel Query)는 하나의 SQL 요청을 n개의 백그라운드 프로세스가 자동으로 나눠 처리하는 방법입니다. 오라클 데이터베이스 사용자는 SQL 문장에 옵티마이저 힌트(/*+ parallel */
) 하나만 추가함으로써 손쉽게 병렬 처리를 할 수 있습니다.
애플리케이션 병렬(Application Parallel)은 사용자가 직접 작업 대상을 작은 단위 그룹으로 나누고 n개의 SQL 문장을 동시에 요청하고 실행하는 방법입니다. 이 방식은 일반적으로 애플리케이션(C언어, 자바, 파이썬 등)으로 구현하기 때문에 병렬 쿼리(Parallel Query)에 비하면 처리가 복잡한 편입니다.
DBMS_PARALLEL_EXECUTE 패키지는 이 방식을 다른 프로그래밍 언어 없이 PL/SQL 만으로 쉽게 구현할 수 있는 오라클 내장 패키지입니다.
참고로 오라클 공식 매뉴얼은 아래 링크를 참고하기 바랍니다.
DBMS_PARALLEL_EXECUTE 병렬 처리 절차
1. 병렬 작업 생성하기
병렬 처리를 위한 작업(Task)을 생성합니다. 생성한 작업(Task)는 DBA_PARALLEL_EXECUTE_TASKS 뷰(View)에서 자세한 정보를 조회할 수 있습니다.
BEGIN
DBMS_PARALLEL_EXECUTE.CREATE_TASK( task_name=>'test' );
END;
/
SELECT * FROM DBA_PARALLEL_EXECUTE_TASKS;
TASK_OWNER TASK_NAME CHUNK_TYPE STATUS TABLE_OWNER TABLE_NAME NUMBER_COLUMN TASK_COMMENT
---------- ---------- -------------------- ------------------- ------------ ------------ -------------- -------------
DATAWAY test UNDECLARED CREATED
2. 데이터 청크(Chunk) 생성
다음은 가장 중요한 청크(Chunk)를 생성합니다. 병렬 처리의 기본은 대량의 데이터를 여러 개의 작은 데이터 그룹으로 나누고 동시에 처리하는 것입니다.
이 때 나눠진 작은 단위 데이터 그룹을 데이터 청크(Chunk)라고 합니다. 데이터 청크(Chunk)는 두 가지 방법으로 만들 수 있습니다. 각각 살펴보겠습니다.
2-1. ROWID 기준으로 청크 생성
병렬 처리 대상이 되는 기본 테이블이 있다면 이 테이블의 데이터를 ROWID를 기준으로 작게 분할합니다.
아래 예제는 청크(Chunk) 하나에 약 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 뷰(View)를 통해 자세한 정보와 이후의 병렬 작업 진행 상황을 모니터링 할 수 있습니다.
SELECT * FROM DBA_PARALLEL_EXECUTE_CHUNKS;
3. 병렬 작업 실행하기
청크 생성을 완료한 후에는 작업을 실행합니다.
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;