我写了一个存储过程,效率特别低,大致情况如下:  有三个表,一个是临时T表,一个是总表A表,表C  
T有2列,列名分别为: T1,T2  
A表有3列,列名分别为: A1(T1),A2(T2),A3,  
(A1和T1,A2和T2,对应的值是一样的)  
需要逐条处理,  
通过T表T1,T2的值,查找出A表中A3的值,然后把 T1,T2,A3 的值,插入到C表中  因为A表中有千万条数据,  
所以,每次用 T1+T2 作为条件,在A表中查找出A3的值,因为A表有1千万条数据,  
查找1次就需要40多秒,  T表有1000万条数据,处理完这1000万条数据就需要好几天,  有什么好的办法,希望大家给点意见,缩短时间。 
存储过程代码如下: 
create or replace procedure t_proc 
as 
t_t1 varchar2(100) ; 
t_t2 varchar2(100) ; t_a3 varchar2(100) ; cursor tcur is select T1,T2 from T ; begin 
  open tcur ; 
   
  loop   
  fetch tcur into t_t1,t_t2 ;  
  exit when tcur%notfound ; 
-- 1, 利用 T1,T2从A表中取出 A3的值 
     select a3 into t_A3  from A where a1=t_t1 and a2=t_t2 ; 
   
  dbms_output.put_line(t_t1 ¦ ¦' <--->' ¦ ¦t_t2 ¦ ¦' <---->' ¦ ¦t_a3) ; 
-- 2 , 将值插入 c 表中   
  insert into c (c1,c2,c3) values (t_t1,t_t2,t_a3) ; 
   
  end loop ; 
   commit ; 
   
   close tcur ; 
end ;

解决方案 »

  1.   

     你不要用游标 
    直接用这条语句插入数据试试 
    insert into c(c1,c2,c3)  
    select t.t1,t.t2,a.a3 
    from t,a 
    where t.t1=a.a1 and t.t2=a.t2 你这种直接可以insert的就不要用游标,效率会有影响的 
    另外t表和a表的数据是不是一样多? 
    from t,a 尽可能把纪录小的表写到后面
      

  2.   


    建过索引了。谢谢大家了,问题还是没有解决,坐等大家帮忙,补充一些条件:
    T 表 和A 表只是有一些交集,需要把A表补充成全集,然后把符合条件的数据,插入到C表中。大家快快快帮帮小弟