我创建了一个 Oracle 块来检查使用 nocopy 对关联数组的影响;创建一个包含 1000000 个元素的数组并将其作为参数传递给两个相同的方法,第一次作为 in out 参数,第二个作为 in out nocopy。代码如下所示:
declare
type my_type is table of varchar2(32767) index by binary_integer;
my_array my_type;
st number;
rt number;
procedure in_out(m1 in out my_type)
is
begin
dbms_output.put_line(my_array(1));
end in_out;
procedure in_out_nocopy(m1 in out nocopy my_type)
is
begin
dbms_output.put_line(my_array(1));
end in_out_nocopy;
begin
for i in 1..999999 loop
my_array(i) := '123456789012345678901234567890123456789012345678901234567890abcd';
end loop;
st := dbms_utility.get_time;
in_out(my_array);
rt := (dbms_utility.get_time - st)/100;
dbms_output.put_line('Time needed for in out is: ' || rt || ' 100''ths of second!');
st := dbms_utility.get_time;
in_out_nocopy(my_array);
rt := (dbms_utility.get_time - st)/100;
dbms_output.put_line('Time needed for in out nocopy is: ' || rt || ' 100''ths of second!');
end;
现在这将报告 nocopy 方法的性能提高了 0.27 秒。我对两件事感到困惑:
i)如果我将两种方法的主体更改为
begin
null;
end;
不会注意到时间差异,但是参数传递的差异仍然存在。为什么会这样?
ii)如果我将程序主体保留为
begin
null;
end;
这一次,我没有将参数定义为 in out 和 in out nocopy,而是将其定义为 out 和 out nocopy,我确实得到了时间差。我想出参数无论如何都会重新初始化,那么为什么我在这里得到一个时差而不是在 out case 中呢?
问候,克里斯托斯