我发现在实例变大时调用Oracle对象类型的方法需要更长的时间。大对象类型的奇怪行为
下面的代码只是将行添加到存储在对象类型中的集合中,并且在循环中调用空dummy
dummy
-过程。
当集合中有更多行时,调用需要更长的时间。当我刚刚删除调用dummy
,性能好得多(集合中还会包含相同数量的记录):
Calling dummy: Not calling dummy:
11 0
81 0
158 0
代码重现:
Create Type t_tab Is Table Of VARCHAR2(10000);
Create Type test_type As Object(
tab t_tab,
Member Procedure dummy
);
Create Type Body test_type As
Member Procedure dummy As Begin
Null; --# Do nothing
End dummy;
End;
Declare
v_test_type test_type := New test_type(New t_tab());
Procedure run_test As
start_time NUMBER := dbms_utility.get_time;
Begin
For i In 1 .. 200 Loop
v_test_Type.tab.Extend;
v_test_Type.tab(v_test_Type.tab.Last) := Lpad(' ', 10000);
v_test_Type.dummy(); --# Removed this line in second test
End Loop;
dbms_output.put_line(dbms_utility.get_time - start_time);
End run_test;
Begin
run_test;
run_test;
run_test;
End;
我试图与这两个10g和11g。
任何人都可以解释/重现此行为?
@Justin Cave:谢谢,但是我怕你的回答不正确。 'function'部分非常有趣,但是你的测试设置了'v_test_Type.tab(v_test_Type.tab.Last)',所以你总是覆盖id'200','400'和'600'中的值,而我的解决方案总是将收集量增加一个,所以我填充了每个ID。花了我一些时间来解决这个问题,虽然:) – 2010-04-16 09:50:45
@Justin洞穴:再次感谢,发现了我自己 - 看到我的答案,如果你有兴趣。 – 2010-04-17 07:05:40