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 정보 업데이트는 다음의 순서로 이루어집니다.
STATUS를 ASSIGNED로 변경
START_TIMESTAMP를 현재 시각으로 변경
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 정보 업데이트는 다음의 순서로 이루어집니다.
STATUS를 ASSIGNED로 변경
START_TIMESTAMP를 현재 시각으로 변경
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

