Oracle中循环遍历从一个表中查出30W数据,并插入另一个表.我用了4个多小时,求问怎样优化?
cursorall_stationisselectstation_namefromgj_station;beginopenall_station;loopfetchall...
cursor all_station is select station_name from gj_station;
begin open all_station ;
loop fetch all_station into start_station; exit when all_station%notfound; for end_station in (select station_name from gj_station) loop insert into GJ_ZEROTRANS (id,start_station,line,end_station,stop_count) (select zero_id.nextval,a1.station_name, a1.line_name, a2.station_name, (a2.position-a1.position) stopcount from ********* where a1.id = a2.id and a1.position < a2.position); commit; end loop;end loop; 展开
begin open all_station ;
loop fetch all_station into start_station; exit when all_station%notfound; for end_station in (select station_name from gj_station) loop insert into GJ_ZEROTRANS (id,start_station,line,end_station,stop_count) (select zero_id.nextval,a1.station_name, a1.line_name, a2.station_name, (a2.position-a1.position) stopcount from ********* where a1.id = a2.id and a1.position < a2.position); commit; end loop;end loop; 展开
3个回答
2014-01-14
展开全部
cursor all_station is
select station_name from gj_station;
begin
open all_station ;
loop
fetch all_station into start_station;
exit when all_station%notfound;
for end_station in (select station_name from gj_station) loop
insert into GJ_ZEROTRANS (id,start_station,line,end_station,stop_count)
(select zero_id.nextval,a1.station_name, a1.line_name, a2.station_name, (a2.position-a1.position) stopcount
from *********
where a1.id = a2.id and a1.position < a2.position);
commit;
end loop;
end loop;
你的存储过程, 格式化一下以后
显示的是, 你是 30W * 30W 的级别来处理的啊
外面一个
loop
fetch all_station into start_station;
exit when all_station%notfound;
30W
里面一个
for end_station in (select station_name from gj_station) loop
30W
也就是你执行了那个 30W * 30W 次 insert into GJ_ZEROTRANS ... 语句啊...
更多追问追答
追问
是这样的,这两层循环一共可以循环出30W左右数据。不是一层循环就30W。
追答
select COUNT( station_name ) from gj_station
这个表多少行记录
然后执行一个
select
count(*)
from *********
where a1.id = a2.id
看看行数多少, 耗时多少。
展开全部
1.为什么要用两个循环?第二个for循环的意义何在?
2.你定义了游标,为什么我在你循环往另外一个表插入数据的时候跟游标没半毛钱关系?
3.插入一笔数据就commit一次,commit也要花时间的大哥。
在做数据的insert之前,请将目标表的约束和索引去掉,inset完了之后,再建立
insert into tab1 select * from tab2;
commit;
直接用这个,一般千万级的数据可在一小时内完成。
建议直接用游标控制,只要一个循环。insert 时用批量提交。本来想帮你重新写一下,可是你的from **********,不知道你这里还有什么业务逻辑
2.你定义了游标,为什么我在你循环往另外一个表插入数据的时候跟游标没半毛钱关系?
3.插入一笔数据就commit一次,commit也要花时间的大哥。
在做数据的insert之前,请将目标表的约束和索引去掉,inset完了之后,再建立
insert into tab1 select * from tab2;
commit;
直接用这个,一般千万级的数据可在一小时内完成。
建议直接用游标控制,只要一个循环。insert 时用批量提交。本来想帮你重新写一下,可是你的from **********,不知道你这里还有什么业务逻辑
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-01-14
展开全部
分析下表数据,建立表的主键,利用主键索引查询,30w的数据不大,很快就可以查询出
追问
主键都有,索引还没建,建完索引查询快了,但是插入不就慢了么。
追答
30w的数据一次全部都插入的话是会慢点,但是你可以分块插入,比如分成10个数据块依次插入,这样就不会很慢了。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询