連想配列で nocopy を使用した場合の効果を確認するために、Oracle ブロックを作成します。1000000 個の要素を持つ配列を作成し、それを引数として 2 つの同一のメソッドに渡します。最初は in out パラメータとして、2 回目は 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 秒改善したことが報告されます。私は2つのことに困惑しています:
i) 両方のメソッドの本体を次のように変更した場合
begin
null;
end;
時間の違いはありませんが、パラメータの受け渡しには違いがあります。なぜそれが起こるのですか?
ii) 手順本体をそのままにしておく場合
begin
null;
end;
今回は、パラメーターを in out および in out nocopy と定義するのではなく、out および out nocopy と定義します。時間差が発生します。とにかくパラメーターが再初期化されると思ったのに、なぜここで時間差が発生し、アウトの場合ではないのですか?
よろしく、クリストス