Oracle DB 내에서 PL/SQL "함수" 를 만들때 병렬처리 옵션을 줄 수가 있습니다.
병렬처리 옵션 주는 방법은 매우 간단한데, 효과는 엄청납니다.
create function 함수 생성 문장에서 "parallel_enable" 문구만 뒤에 추가해주면 끝입니다.
-- 함수 (싱글처리)
create or replace function func_s (p_val number) return number
is
v_ret number;
begin
select dbms_random.value(1, p_val) into v_ret
from dual;
return v_ret;
end;
/
-- 함수 (병렬처리)
create or replace function func_p (p_val number) return number parallel_enable
is
v_ret number;
begin
select dbms_random.value(1, p_val) into v_ret
from dual;
return v_ret;
end;
/
어떻게 차이가 나는지 확인해 보겠습니다.
테스트 데이터 4백만건을 만들어서 싱글함수를 호출할때와 병렬함수를 호출할 때 얼마나 차이가 나는지 확인해 보겠습니다.
-- 테스트 테이블 생성
create table TEST1
as
select empno, salary, deptno,
lpad(ename, 5, ename) as ename,
lpad(addr, 5, addr) as addr
from ( select level + 10000000 as empno,
mod(level,1000) + 10000 as salary,
mod(level,20) as deptno,
chr(97+mod(level,26)) as ename,
chr(65+mod(level,26)) as addr
from dual
connect by level <= 2000000
);
-- 한번더 증식해서 4백만건으로 생성
insert into TEST1 select * from TEST1;
아래처럼, 함수를 4백만번 호출하는 SQL문을 parallel(10) 힌트를 주어 병렬처리로 수행합니다.
select /*+ parallel(10) */ avg(hash_val)
from (
select func_s(empno) as hash_val
from TEST1
)
;
Elapsed: 00:01:42.52
select /*+ parallel(10) */ avg(hash_val)
from (
select func_p(empno) as hash_val
from TEST1
)
;
Elapsed: 00:00:21.40
싱글함수인 func_s 로 호출했을때는 1분42초가 걸렸고, 병렬함수인 func_p 로 호출했을때는 21초가 걸렸습니다.
5배정도 차이가 나네요~ 욜~~
이런 속도 차이의 원인은 실제로 병렬로 처리되었는지의 유무와 관계되어 있습니다.
SQL 모니터로 조회해보면 차이를 정확히 확인할 수 있습니다.
싱글함수로 실행할때는 /*+ parallel(10) */ 힌트를 주었어도 여전히 싱글로 처리되는 것을 확인할 수 있습니다.
병렬함수로 실행할때는 아래처럼 병렬로 처리되는 것을 확인할 수 있습니다.
참고 ▶▶▶ 오라클 병렬처리 종합페이지
'IT관련' 카테고리의 다른 글
오라클 like 구문 업그레이드 regexp_like 샘플예제 (정규표현식 기본 응용) (0) | 2020.12.09 |
---|---|
오라클 정규식, 정규표현식(Regular Expression) 이란? 그리고 사용방법. (0) | 2020.12.09 |
테이블, 인덱스, 뷰, 시퀀스 rename to (이름 변경) SQL 구문 (ORA-14047, ORA-01765) (2) | 2020.12.07 |
ORA-600, ORA-7445 등 Internal 에러 분석할때 필요한 정보수집 TFA툴 소개 (0) | 2020.12.05 |
오라클 에러 (ORA-00998: must name this expression with a column alias) (0) | 2020.12.01 |