有三个表,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秒,并且变得越来越不可接受。
答案 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的行。