본문 바로가기

IT관련

오라클 PL/SQL 함수(Function) 병렬처리 옵션 (parallel_enable)

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) */ 힌트를 주었어도 여전히 싱글로 처리되는 것을 확인할 수 있습니다.

병렬함수로 실행할때는 아래처럼 병렬로 처리되는 것을 확인할 수 있습니다.

 

 

참고 ▶ 오라클 병렬처리 종합페이지