값 전달과 레퍼런스 전달의 속도 차이를 테스트해보자.
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 스키마이고, 오라클 설치시 생성할 수 있는 기본 스키마 입니다>
'Database > PLSQL' 카테고리의 다른 글
072 - [Oracle PL/SQL] RESULT_CACHE hint (0) | 2024.04.10 |
---|---|
071 - [Oracle PL/SQL] PARALLEL_ENABLE hint (0) | 2024.04.10 |
069 - [Oracle PL/SQL] NOCOPY 예외상황 (0) | 2024.04.10 |
068 - [Oracle PL/SQL] NOCOPY (0) | 2024.04.10 |
067 - [Oracle PL/SQL] AUTONOMOUS TRANSACTION (0) | 2024.04.09 |