DBMS_PARALLEL_EXECUTE

DBMS_PARALLEL_EXECUTE 패키지의 기본 개념과 패키지 내의 프러시저와 함수를 사용하는 방법을 설명합니다.

개요

DBMS_PARALLEL_EXECUTE는 병렬 방식으로 테이블을 업데이트할 수 있는 기능을 제공하는 패키지입니다.

이 패키지는 테이블의 행 집합을 CHUNK 단위로 그룹화한 뒤, 각 CHUNK에 대해 사용자 지정 SQL을 병렬로 수행하고, 각 CHUNK의 처리가 완료되면 COMMIT을 수행합니다.

다음은 DBMS_PARALLEL_EXECUTE 패키지를 사용할 때 유의해야 할 사항입니다.

  • 호출자 권한 : 해당 패키지는 호출자 권한으로 실행됩니다. 만약 다른 프러시저나 함수에서 호출되는 경우 해당 프러시저나 함수의 실행자 권한으로 실행됩니다.

  • 병렬 실행 시 권한 : 병렬 실행은 DBMS_SCHEDULER의 CREATE_JOB을 통해 수행됩니다. 호출자는CREATE_JOB 권한이 있어야 합니다.

  • SQL 수행 권한 : CREATE_CHUNKS_BY_SQL, RUN_TASK, RESUME_TASK는 SQL을 필요로 하며 내부적으로 DBMS_SQL을 사용합니다.

상수

본 절에서는 DBMS_PARALLEL_EXECUTE 패키지에서 제공하는 상수를 알파벳 순으로 설명합니다.

CHUNK 상태 상수

CHUNK 상태를 표현한 상수는 아래와 같습니다.

상수 이름
상수 타입
상수 값
설명

ASSIGNED

NUMBER

1

CHUNK가 작업 처리를 위해 할당된 상태

PROCESSED

NUMBER

2

CHUNK에 대한 작업 처리가 성공적으로 수행되었음

PROCESSED_WITH_ERROR

NUMBER

3

CHUNK에 대한 작업 처리가 완료 되었으나, 수행 도중 에러가 발생

UNASSIGNED

NUMBER

0

CHUNK가 작업 처리에 할당되지않은 상태

TASK 상태 상수

TASK 상태를 표현한 상수는 아래와 같습니다.

상수 이름
상수 타입
상수 값
설명

CHUNKED

NUMBER

5

CHUNK 생성에 성공하였으나, 아직 CHUNK들이 ASSIGN되거나 PROCESS되지 않았음

CHUNKING

NUMBER

2

CHUNK 생성 작업이 진행 중

CHUNKING_FAILED

NUMBER

3

CHUNK 생성 작업에 실패

CRASHED

NUMBER

9

  • CHUNK의 상태가 ASSIGNED 혹은 UNASSIGNED인 상태에서 JOB이 CRASH되었음

  • 이 상태 상수는 병렬 수행 시에만 발생 가능

CREATED

NUMBER

1

TASK가 생성

FINISHED

NUMBER

7

모든 CHUNK의 작업 처리가 에러 없이 수행

FINISHED_WITH_ERROR

NUMBER

8

모든 CHUNK의 작업 처리가 완료 되었으나, 에러가 발생한 CHUNK 들이 있음

NO_CHUNKS

NUMBER

4

TASK와 연관된 테이블로 생성된 CHUNK가 없음

PROCESSING

NUMBER

6

CHUNK에 대한 작업 처리가 수행 중

예외

다음은 DBMS_PARALLEL_EXECUTE 패키지에서 미리 제공된 예외를 알파벳 순으로 설명합니다.

예외 이름
예외 코드
설명

CHUNK_NOT_FOUND

14329

지시된 CHUNK를 찾지 못함

DUPLICATE_TASK_NAME

14327

동일한 TASK 이름이 이미 같은 사용자에게서 생성 되어 있음

INVALID_STATE_FOR_CHUNK

14322

CREATED 혹은 CHUNKING_FAILED 상태가 아닌 TASK에 대해 CHUNK 생성 작업을 시도

INVALID_STATE_FOR_RESUME

14325

작업 처리를 재개하려 했으나, TASK의 상태가 FINISHED_WITH_ERROR 혹은 CRASHED가 아님

INVALID_STATE_FOR_RUN

14324

작업 처리를 수행하려 했으나, TASK의 상태가 CHUNKED가 아님

INVALID_STATUS

14323

CHUNK의 상태 변경에 잘못된 변수가 지정되었음

INVALID_STRING_PARAM

14326

입력받은 변수가 NULL이거나, 허용된 길이를 초과

INVALID_TABLE

14321

CHUNK 생성을 시도한 테이블이 물리적인 테이블이 아니거나 Index-Organized Table

TASK_NOT_FOUND

14328

명시된 task_name을 찾지 못하였음

실체화 뷰

다음은 DBMS_PARALLEL_EXECUTE 패키지에서 사용되는 뷰를 알파벳 순으로 나열합니다.

  • DBA_PARALLEL_EXECUTE_CHUNKS

  • DBA_PARALLEL_EXECUTE_TASKS

  • USER_PARALLEL_EXECUTE_CHUNKS

  • USER_PARALLEL_EXECUTE_TASKS

프러시저와 함수

본 절에서는 DBMS_PARALLEL_EXECUTE 패키지에서 제공하는 프러시저와 함수를 설명합니다.

CREATE_TASK

호출자에 대한 TASK를 생성하는 프러시저입니다. TASK 이름과 이 프러시저를 호출하는 호출자는 고유해 야 합니다.

CREATE_TASK 프러시저의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
설명

task_name

  • 생성할 TASK의 이름

  • 128바이트까지 허용

comment

  • 생성할 TASK를 설명하는 정보

  • 4000바이트까지 허용

  • 예외 상황

예외 상황
설명

IN

VALID_STRING_PARAM

  • 입력된 변수가 NULL이 허용되지 않거나, 허용된 길이를 초과한 경우

DUPLI

CATE_TASK_NAME

  • 해당 유저로 동일한 TASK 이름이 이미 존재하는 경우

  • 예제

CREATE_CHUNKS_BY_NUMBER_COL

지정된 컬럼에 따라 CHUNKS를 생성하는 프러시저입니다. 지정된 컬럼은 NUMBER 타입이어야 합니다.

이 프러시저는 지정된 컬럼의 최솟값과 최댓값을 확인한 다음, chunk_size에 따라 범위를 균등하게 나눕니다.

CREATE_CHUNKS_BY_NUMBER_COL 프러시저의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
설명

task_name

TASK의 이름

table_owner

테이블의 소유자 이름

table_name

테이블의 이름

table_column

  • 테이블의 컬럼 이름

  • NUMBER 타입이어야 함

chunk_size

각 CHUNK의 범위

  • 예외 상황

예외 상황
설명

IN

VALID_STATE_FOR_CHUNK

현재 TASK의 상태가 CREATED 혹은 CHUNKING_FAILED가 아닌 경우

IN

VALID_STRING_PARAM

입력된 변수가 NULL이 허용되지 않거나, 허용된 길이를 초과한 경우

TASK_NOT_FOUND

지정된 task_name에 맞는 TASK를 찾지 못한 경우

  • 예제

CREATE_CHUNKS_BY_ROWID

ROWID별로 CHUNK를 생성하는 프러시저입니다.

테이블의 행 수와 블럭 수는 개별 CHUNK를 생성하는 근사치 기준입니다. 이때 테이블은 물리적인 ROWID 를 가진 테이블이어야 합니다. 단, IOT는 허용하지 않습니다.

CREATE_CHUNKS_BY_ROWID 프러시저의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
설명

task_name

TASK의 이름

table_owner

테이블의 소유자 이름

table_name

테이블의 이름

by_row

  • TRUE일 경우 chunk_size가 row 수에 기반

  • FALSE일 경우 block 수에 기반

chunk_size

  • 각 CHUNK의 범위

  • by_row 인자에 따라 row/block이 달라지며, 근사치로 계산

  • 예외 상황

예외 상황
설명

INVALID_TABLE

입력된 테이블이 물리적 테이블이 아니거나 IOT인 경우

INVALID_STATE_FOR_CHUNK

현재 TASK의 상태가 CREATED 혹은 CHUNKING_FAILED가 아닌 경우

INVALID_STRING_PARAM

입력된 변수가 NULL이 허용되지 않거나, 허용된 길이를 초과한 경우

TASK_NOT_FOUND

지정된 task_name에 맞는 TASK를 찾지 못한 경우

  • 예제

CREATE_CHUNKS_BY_SQL

사용자 지정SELECT 문에 의해 CHUNK를 생성하는 프러시저입니다.

SELECT 문은 start_id 및 end_id의 두 컬럼으로 각 CHUNK의 범위를 반환해야합니다. by_rowid가 TRUE인 경우 두 컬럼은 ROWID를 반환해야 하며, FALSE인 경우 NUMBER 타입을 반환해야 합니다. CREATE_CHUNKS_BY_SQL 프러시저의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
설명

task_name

TASK의 이름

sql_stmt

CHUNK의 범위를 반환하는 SQL 문

by_rowid

CHUNK 생성이 ROWID 기반일 경우 TRUE, NUMBER 기반일 경우 FALSE

  • 예외 상황

예외 상황
설명

IN

VALID_STATE_FOR_CHUNK

현재 TASK의 상태가 CREATED 혹은 CHUNKING_FAILED가 아닌 경우

IN

VALID_STRING_PARAM

입력된 변수가 NULL이 허용되지 않거나, 허용된 길이를 초과한 경우

TASK_NOT_FOUND

지정된 task_name에 맞는 TASK를 찾지 못한 경우

  • 예제

DROP_CHUNKS

TASK에 연관된 모든 CHUNK들을 삭제하는 프러시저입니다.

DROP_CHUNKS 프러시저의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
설명

task_name

TASK의 이름

  • 예외 상황

예외 상황

INVALID_STRING_PARAM

입력된 변수가 NULL이 허용되지 않거나, 허용된 길이를 초과한 경우

TASK_NOT_FOUND

지정된 task_name에 맞는 TASK를 찾지 못한 경우

  • 예제

DROP_TASK

해당 TASK와 연관된 CHUNK까지 모두 삭제하는 프러시저입니다. DROP_TASK 프러시저의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
설명

task_name

TASK의 이름

  • 예외 상황

예외 상황
설명

INVALID_STRING_PARAM

입력된 변수가 NULL이 허용되지 않거나, 허용된 길이를 초과한 경우

TASK_NOT_FOUND

지정된 task_name에 맞는 TASK를 찾지 못한 경우

  • 예제

GENERATE_TASK_NAME

고유한 TASK 이름을 생성하여 반환합니다.

GENERATE_TASK_NAME 함수의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
설명

prefix

TASK 이름을 생성할 때 접두사로 쓰일 문자열

  • 예제

GET_NUMBER_COL_CHUNK

이 프러시저를 수행하면 할당되지 않은 NUMBER 타입의 CHUNK 하나를 골라 상태를 ASSIGNED로 변경합니다.

할당할 수 있는 CHUNK가 없으면 any_rows를 FALSE로 반환하며, 그렇지 않을 경우에는 chunk_id, start_id, end_id의 값이 반환됩니다.

DBA_PARALLEL_EXECUTE_CHUNKS, USER_PARALLEL_EXECUTE_CHUNKS 뷰에 대한 CHUNK 정보 업데이트는 다음의 순서로 이루어집니다.

  1. STATUS를 ASSIGNED로 변경

  2. START_TIMESTAMP를 현재 시각으로 변경

  3. END_TIMESTAMP는 삭제

GET_NUMBER_COL_CHUNK 프러시저의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
설명

task_name

TASK의 이름

chunk_id

반환될 CHUNK의 chunk_id 값

start_id

반환될 CHUNK의 start_id 값

end_id

반환될 CHUNK의 end_id 값

any_rows

할당할 수 있는 CHUNK가 있는지 여부를 반환

  • 예외 상황

예외 상황
설명

INVALID_STRING_PARAM

입력된 변수가 NULL이 허용되지 않거나, 허용된 길이를 초과한 경우

TASK_NOT_FOUND

지정된 task_name에 맞는 TASK를 찾지 못한 경우

  • 예제

GET_ROWID_CHUNK

이 프러시저를 수행하면 할당되지 않은 ROWID 타입의 CHUNK 하나를 골라 상태를 ASSIGNED로 변경합니다.

할당할 수 있는 CHUNK가 없으면 any_rows를 FALSE로 반환하며, 그렇지 않을 경우에는 chunk_id, start_rowid, end_rowid의 값이 반환됩니다.

DBA_PARALLEL_EXECUTE_CHUNKS, USER_PARALLEL_EXECUTE_CHUNKS 뷰에 대한 CHUNK 정보 업데이트는 다음의 순서로 이루어집니다.

  1. STATUS를 ASSIGNED로 변경

  2. START_TIMESTAMP를 현재 시각으로 변경

  3. END_TIMESTAMP는 삭제

GET_ROWID_CHUNK 프러시저의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
설명

task_name

TASK의 이름

chunk_id

반환될 CHUNK의 chunk_id 값

start_rowid

반환될 CHUNK의 start_rowid 값

end_rowid

반환될 CHUNK의 end_rowid 값

any_rows

할당할 수 있는 CHUNK가 있는지 여부를 반환

  • 예외 상황

예외 상황
설명

INVALID_STRING_PARAM

입력된 변수가 NULL이 허용되지 않거나, 허용된 길이를 초과한 경우

TASK_NOT_FOUND

지정된 task_name에 맞는 TASK를 찾지 못한 경우

  • 예제

PURGE_PROCESSED_CHUNKS

PROCESSED 혹은 PROCESSED_WITH_ERROR 상태의 CHUNK들을 모두 삭제합니다. PURGE_PROCESSED_CHUNKS 프러시저의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
설명

task_name

TASK의 이름

  • 예외 상황

예외 상황
설명

IN VALID_STRING_PARAM

입력된 변수가 NULL이 허용되지 않거나, 허용된 길이를 초과한 경우

TASK_NOT_FOUND

지정된 task_name에 맞는 TASK를 찾지 못한 경우

  • 예제

RESUME_TASK

이 프러시저는 RUN_TASK 프러시저가 에러와 함께 완료되♘거나 충돌이 발생한 경우 사용합니다. 즉 TASK의 상태 정보가 PROCESSED_WITH_ERROR 혹은 CRASHED일 경우에만 사용할 수 있습니다.

RUN_TASK가 병렬 수행이 아닌 경우 충돌이 발생하면 상태 정보가 PROCESSING으로 유지됩니다. 이 경 우 force 옵션을 TRUE로 사용하면 처리 작업을 재개할 수 있습니다. 그러나 충돌이 발생했는지 확인하는 것은 사용자의 책임 하에 있습니다.

이 프러시저는 처리되지 않은 CHUNK들의 처리 작업을 재개합니다. PROCESSED_WITH_ERROR 혹은 ASSIGNED 상태의 CHUNK들 또한 COMMIT되지 않았으므로 처리 작업이 재개됩니다.

이 프러시저는 RUN_TASK 프러시저와 동일한 인자를 사용하며, task_name만을 사용하도록 오버로드된 함수의 경우 이전 RUN_TASK 혹은 RESUME_TASK 호출 시 제공된 변수를 재사용합니다.

RESUME_TASK 프러시저의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
설명

task_name

TASK의 이름

sql_stmt

  • 수행할 SQL 문장

  • 이 SQL은 :start_id와 :end_id 매개 변수를 포함해야 함

language_flag

지원되지 않는 기능이므로 값을 무시

edition

지원되지 않는 기능이므로 값을 무시

apply_crossedition_trigger

지원되지 않는 기능이므로 값을 무시

fire_apply_trigger

지원되지 않는 기능이므로 값을 무시

parallel_level

  • 수행될 병렬 작업 수 0이면 serial하게 수행되며, NULL일 경우 기본 병 렬 수행 정도를 따름

job_class

병렬 수행될 경우 속할 JOB CLASS

force

TRUE로 설정하면 상태 정보가 PROCESSING일 때 에러를 발생시키지 않고 처리 작업을 재개

  • 예외 상황

예외 상황
설명

IN VALID_STATE_FOR_RE SUME

TASK의 상태가 FINISHED_WITH_ERROR 혹은 CRASHED가 아닌 경우

IN VALID_STRING_PARAM

입력된 변수가 NULL이 허용되지 않거나, 허용된 길이를 초과한 경우

TASK_NOT_FOUND

지정된 task_name에 맞는 TASK를 찾지 못한 경우

  • 예제

RUN_TASK

지정된 SQL 문장(sql_stmt)을 수행합니다. 해당 SQL은 호출자의 권한으로 수행됩니다.

지정된 SQL 문장에는 CHUNK의 범위를 나타내는 :start_id와 :end_id 매개 변수가 있어야 합니다. 각 매개 변수는 ROWID(ROWID 타입의 CHUNK를 생성한 경우) 혹은 NUMBER(NUMBER 타입의 CHUNK를 생성한 경우) 타입이어야 합니다.

병렬 수행이 요청되면(parallel_level) DBMS_SCHEDULER를 통해 JOB 세션을 할당 받아 수행됩니다. 때문에 병렬 수행을 위해서는 DBMS_SCHEDULER 패키지의 CREATE_JOB 프러시저 권한이 있어야 합니다. parallel_level에 NULL을 입력하는 경우 기본 병렬 수행 수치를 계산하며, 이는 CPU_COUNT 파라미터와PARALLEL_THREADS_PER_CPU 파라미터를 사용하여 계산됩니다.

이 프러시저는 모든 CHUNK들의 수행이 완료된 후에 종료되며, 병렬 수행의 경우 JOB 세션들의 작업이 완료된 후 종료됩니다.

RUN_TASK 프러시저의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
설명

task_name

TASK의 이름

sql_stmt

  • 수행할 SQL 문장

  • 이 SQL은 :start_id와 :end_id 매개 변수를 포함해야 함

language_flag

지원되지 않는 기능이므로 값을 무시

edition

지원되지 않는 기능이므로 값을 무시

apply_crossedition_trigger

지원되지 않는 기능이므로 값을 무시

fire_apply_trigger

지원되지 않는 기능이므로 값을 무시

parallel_level

  • 수행될 병렬 작업 수

  • 0이면 serial하게 수행되며, NULL일 경우 기본 병렬 수행 정도를 따름

job_class

병렬 수행될 경우 속할 JOB CLASS

  • 예외 상황

예외 상황
설명

INVALID_STATE_FOR_RUN

TASK의 상태가 CHUNKED가 아닌 경우

INVALID_STRING_PARAM

입력된 변수가 NULL이 허용되지 않거나, 허용된 길이를 초과한 경우

TASK_NOT_FOUND

지정된 task_name에 맞는 TASK를 찾지 못한 경우

  • 예제

HUNK_STATUS

CHUNK 하나의 상태 정보를 변경합니다. SET_CHUNK_STATUS 프러시저의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
설명

task_name

TASK의 이름

chunk_id

상태 정보를 변경할 CHUNK의 chunk_id 값

status

변경할 상태 정보

err_num

변경할 에러 코드 번호

err_msg

변경할 에러 문장

  • 예외 상황

예외 상황
설명

CHUNK_NOT_FOUND

chunk_id에 해당하는 CHUNK를 찾지 못한 경우

INVALID_STATUS

허용되지 않은 STATUS 값을 입력한 경우

INVALID_STRING_PARAM

입력된 변수가 NULL이 허용되지 않거나, 허용된 길이를 초과한 경우

TASK_NOT_FOUND

지정된 task_name에 맞는 TASK를 찾지 못한 경우

  • 예제

STOP_TASK

TASK의 수행을 중지합니다.

STOP_TASK 프러시저의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
설명

task_name

TASK의 이름

  • 예외 상황

예외 상황
설명

IN VALID_STRING_PARAM

입력된 변수가 NULL이 허용되지 않거나, 허용된 길이를 초과한 경우

TASK_NOT_FOUND

지정된 task_name에 맞는 TASK를 찾지 못한 경우

  • 예제

TASK_STATUS

TASK의 상태 정보를 반환합니다.

TASK_STATUS 함수의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
설명

task_name

TASK의 이름

  • 예외 상황

예외 상황
설명

INVALID_STRING_PARAM

입력된 변수가 NULL이 허용되지 않거나, 허용된 길이를 초과한 경우

TASK_NOT_FOUND

지정된 task_name에 맞는 TASK를 찾지 못한 경우

  • 예제

Last updated