loop 中insert 效率问题

[复制链接]
查看11 | 回复8 | 2006-11-8 16:17:59 | 显示全部楼层 |阅读模式
在存储过程中
for rec in (select a.id,b.name,b.object from T1 a, T2 b where a.id = b.id ) loop
v = rec.object.getValue();
insert into test(id,name,value)values(rec.id,rec.name,v);
commit;
end loop;
已经用toad 优化过T1,T2索引,不知道为什么100多万条数据居然
用了12个小时!
是用 rec in() 好还是用 cursor loop 好?
回复

使用道具 举报

千问 | 2006-11-8 16:17:59 | 显示全部楼层
不要每次都commit,可以考虑1000行左右一次提交
回复

使用道具 举报

千问 | 2006-11-8 16:17:59 | 显示全部楼层
楼上了,我修改了每1000条commit一次.
效果还是不明显!
改用临时表
execute immediate 'create table tempT as select a.id,b.name,b.object .getValue() from T1 a, T2 b where a.id = b.id ';
for rec in ( select * from tempT ) 效率提供很多
可是在procedure 中没办法动态取得 表tempT
请问如何解决?
回复

使用道具 举报

千问 | 2006-11-8 16:17:59 | 显示全部楼层
建立一个临时表就是了,为什么要动态sql建立?
还有,数据都100w的话,用显式cursor要好些
回复

使用道具 举报

千问 | 2006-11-8 16:17:59 | 显示全部楼层
如果内存足够,那用forall更好
回复

使用道具 举报

千问 | 2006-11-8 16:17:59 | 显示全部楼层
test上有索引吗?
应该一个sql就可以的呀,干吗循环这么麻烦呢?
回复

使用道具 举报

千问 | 2006-11-8 16:17:59 | 显示全部楼层
还是bulk + forall 的方式比较好
回复

使用道具 举报

千问 | 2006-11-8 16:17:59 | 显示全部楼层
搞定了,谢谢所有楼上的,呵呵
回复

使用道具 举报

千问 | 2006-11-8 16:17:59 | 显示全部楼层
這種我都用bulk collect and forall
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行