SQL - 使用动态查询优化表填充

时间:2015-03-18 23:34:28

标签: sql oracle query-optimization

我需要优化以下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小时。

1 个答案:

答案 0 :(得分:1)

您应该使用insert . . . select而不是循环。类似的东西:

insert into my_table
    select t.id, t.indicator
    from   <master_table> t
    where  <conditions>;

这不完全是您所需要的。遵循中间动态查询正在做的事情有点难。