Oracle存储过程性能问题

时间:2016-09-18 09:18:41

标签: oracle performance stored-procedures

有三个表,TA,TB和TC。 TA中的一行映射到两个表中的TB槽列中的大约10行。 TB有一个CLOB列。 TC具有与TB相同的列名和类型,但没有主键,外键或任何索引。 TA有大约100万行,TB有2000万行,TC是空的。并非TB中的所有行都在TA中具有相应的行,只有一半(1000万)在TA中具有相应的行。

我需要做的是将TB中具有相关行的行复制到TC。

在存储过程中,我使用游标循环TA,对于TA中的每一行,选择TB中的相关行并插入TC,其中包含一个语句,如

insert into TC select * from TB where TB.col = :value
在处理TA中的每五行之后发出

Commit

问题是这个简单的存储过程在开始时运行得很快,但变得越来越慢。对于TA中的前1000行,需要1.9秒, 第二千行需要14秒,第三千行需要37秒,并且变得越来越不可接受。

1 个答案:

答案 0 :(得分:0)

如果您想在pl / sql中执行此操作,请执行以下操作:

declare
    cursor src is
        select tb.*
        from    tb
        where exists (
            select null
            from   ta
            where <ta's primary key matches tb's primary keys>
            );
  type t_bulk is table of src%rowtype;
  v_bulk t_bulk;
begin
  open src;
  loop
    fetch src bulk collect into v_bulk limit 1000;
    forall i in 1..v_bulk.count
      insert into tc
        values v_bulk(i);
    commit;
    exit when v_bulk.count < 1000;
  end loop;
  close src;
end;

我现在无权访问Oracle数据库 - 这只是来自内存,可能会有一些语法错误。

更新:TA和TB之间的简单连接可能比使用exists更好。只要src生成您想要插入TC的行。