본문 바로가기

Database/PLSQL

070 - [Oracle PL/SQL] NOCOPY - 성능차이.

값 전달과 레퍼런스 전달의 속도 차이를 테스트해보자.

 

 

create or replace package nocopy_test
is
    type number_t is table of varchar2(20) index by binary_integer;
    procedure pass_by_vale(nums in out number_t);
    procedure pass_by_refernce(nums in out nocopy number_t);
    procedure init;
end;
/
------------
create or replace package body nocopy_test
is
 l_numbers number_t;
 c_array_size number:=1000000;
 c_it number:=20;

    procedure pass_by_vale(nums in out number_t)
    is
        indx pls_integer;
    begin
        indx:=nums.count;
    end;

    procedure pass_by_refernce(nums in out nocopy number_t)
    is
        indx pls_integer;
    begin
        indx:=nums.count;
    end;
    
    procedure init
    is
    begin
        l_numbers.delete;
    
    for i in 1..c_array_size
    loop
        l_numbers(i):='s'||i;
    end loop;
    
    dbms_output.put_line('start '||to_char(sysdate,'hh:mi:ss') );
    for i in 1..1000
        loop
            pass_by_vale(l_numbers);
        end loop;
    dbms_output.put_line('end '||to_char(sysdate,'hh:mi:ss') );
    
    dbms_output.put_line('start '||to_char(sysdate,'hh:mi:ss'));
    for i in 1..1000
        loop
            pass_by_refernce(l_numbers);
        end loop;
        dbms_output.put_line('end '||to_char(sysdate,'hh:mi:ss'));
    
    end;
    
end;
-----------------------------
Package NOCOPY_TEST compiled
Package Body NOCOPY_TEST compiled



begin
    nocopy_test.init;
end;
-----------------------------
start 02:31:18
end 02:31:52
start 02:31:52
end 02:31:52

PL/SQL procedure successfully completed.


# 값 전달의 경우, 대략 34초 정도의 시간이 소요되고, 레퍼런스 전달의 경우, 0초대의 시간이 걸렸다.

 

 

 

<샘플코드에서 사용한 데이터는 HR 스키마이고, 오라클 설치시 생성할 수 있는 기본 스키마 입니다>