问题描述
各位大侠好,现在遇到一个问题求教Oracle里有两张表,一张人员信息表,里面包含了人员和各项基本信息,其中包括了银行代码和银行卡号两个字段。另一张表是记录的银行代码和所有人的银行卡号。现在人员表里只存了银行卡号,我想把银行代码先根据卡号从银行表里查出来,再写入到人员表里的银行代码字段。使用了游标,发现效率很低,约20W条数据,已经执行一个多小时了,各位高手有没有其他更好的办法问题补充首先感谢楼上的兄弟。我现在用的就是方法一,但是银行表里会有重复的银行卡号,要取重复的卡号中银行代码较大的那个数据,这个问题没法解决啊。
解决方案
语句必须要用到索引才能快起来,否则速度没有本质上的提高。楼主可以写语句看下执行计划。
解决方案二:
不要频繁commit,能用一条sql搞定最好,越简单,速度越快.游标也可以BULK collect下,提高效率
解决方案三:
mjwtx 写道各位大侠好,现在遇到一个问题求教Oracle里有两张表,一张人员信息表,里面包含了人员和各项基本信息,其中包括了银行代码和银行卡号两个字段。另一张表是记录的银行代码和所有人的银行卡号。现在人员表里只存了银行卡号,我想把银行代码先根据卡号从银行表里查出来,再写入到人员表里的银行代码字段。使用了游标,发现效率很低,约20W条数据,已经执行一个多小时了,各位高手有没有其他更好的办法t_person(id varchar2(40) primary key,credit_id varchar2(40),credit_code varchar2(40),other varchar2(200));t_credit (id varchar2(40) primary key, code varchar2(40) not null);declare i_count integer default 0;beginfor t in (select rowid,credit_id from t_person) loopupdate t_person s set s.credit_code = (select code from t_credit t where t.id = s.credit_id) where s.rowid = t.rowid;i_count := i_count +1;--采用1000条提交一次,避免占用大量回退段if mod(i_count,1000) = 0 then i_count :=0;commit;end if;commit;end;
解决方案四:
用incline update方式更新,语法:update (select ... from a, b where a.col=b.col) set ...
解决方案五:
不知道楼主是想讨论oralce还是想解决系统问题,楼主的业务场景是?这两张表怎么维护的?考虑下你的设计??
解决方案六:
应该没有那么的慢吧?我上次2张表,30W数据也就2分钟多钟1个多小时,可能ORACLE为了保证写一致性,有很多重启动SQL,而且时间越长,效率越低要是有DBA的话,还是交给DBA来做这个事情吧,毕竟比较专业。
解决方案七:
update t1 set t1.code=(select max(t2.code) from t2 where t2.no=t1.no group by t2.code);一条语句搞的 且效率也不低no 卡号code 银行代码
解决方案八:
说个笨方法,但是速度应该不慢insert into T3(代码,卡号)select max(银行代码),卡号 from t2 group BY 卡号如果语句比较慢,可以人为的将后边查询语句分成几次。然后用表3来执行更新语句
解决方案:
方法1:update t1 set column=(select * from t2 where t2.id=t1.id );方法2:写jdbc,从t2表取出来,update t1 set column=?.用batch的方法执行,应该很快就能搞定。