我需要优化以下pl / sql过程。所以,从根本上说,我的问题是:有一种方法可以在pl / sql中进行批量插入,这比循环通过关联数组更有效吗?
type mydatatype is table of my_table%rowtype index by pls_integer;
type c_type is ref cursor;
dynamic_select := 'select <fields>, ';
dynamic_from := ' from <tables>';
dynamic_where := ' where conditions and period_time >= ';
myobject mydatatype;
cvar c_type;
cursor p1 is
select t.id, t.indicator
from <master_table> t
where <conditions>;
begin
for p in p1 loop
dynamic_query := dynamic_select || p.indicator || dynamic_from || dynamic_where || 'to_date(''' || initial_date || ''', ''DD/MM/YYYY HH24:MI'')' || ' and period_time < ' || 'to_date(''' || end_date || ''', ''DD/MM/YYYY HH24:MI'')';
open cvar for dynamic_query;
loop
fetch cvar bulk collect into myobject limit 10000;
forall i in 1..myobject.count
insert /*+ append */ into my_table values myobject(i);
commit;
exit when cvar%notfound or cvar%notfound is null;
end loop;
close cvar;
end loop;
end
我的理想是大量插入(显然不起作用):
insert into my_table
values myobject;
当我修改了提取限制时,我可以获得性能提升,但还不够。通常,该存储过程将循环一百万次以填充表,但是要求执行时间不超过1小时。现在平均执行时间是2小时。
答案 0 :(得分:1)
您应该使用insert . . . select
而不是循环。类似的东西:
insert into my_table
select t.id, t.indicator
from <master_table> t
where <conditions>;
这不完全是您所需要的。遵循中间动态查询正在做的事情有点难。