oracle插入大批量数据问题

MichellWu 2018-03-15 03:51:18
oracle使用存储过程汇聚数据时需要从视图中查询数据并插入到分区表中,大概5个视图,每个数据量大约1000W数据,我用insert into table(...)select ...这种方式插入时,只需2-3分钟,第二种方式用了游标,从游标中批量读取数据再插入,
dbms_output.put_line('开始时间:'||sysdate);
open bras_cur;
loop
fetch bras_cur bulk collect into resource_tab limit 50000;
exit when resource_tab.count=0;
for i in resource_tab.first .. resource_tab.last
loop
insert into xxx这种方式用了15分钟,
为什么第一种方式比第二种效率高这么多呢,求大神讲解,什么场合用insert into select
什么场合用第二种批量插入的
或者这种情况下我该怎么操作能提高效率呢
...全文
1178 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
minsic78 2018-03-28
  • 打赏
  • 举报
回复
引用 8 楼 wandier 的回复:
[quote=引用 7 楼 minsic78的回复:][quote=引用 6 楼 wandier 的回复:] 1000w,还敢这么操作,不怕事务日志满吗
数仓里千万级甚至上亿的表很常见的~ insert语句本身能优化的余地不多,append/append_values提示 + 表属性nologging是套路[/quote] 表数据的导出,新建表,不建索引,然后再导入新表,最后建索引,这样更好[/quote] 如果条件允许,确实没有索引是最好的,索引对插入的影响太大
wandier 2018-03-28
  • 打赏
  • 举报
回复
引用 7 楼 minsic78的回复:
[quote=引用 6 楼 wandier 的回复:] 1000w,还敢这么操作,不怕事务日志满吗
数仓里千万级甚至上亿的表很常见的~ insert语句本身能优化的余地不多,append/append_values提示 + 表属性nologging是套路[/quote] 表数据的导出,新建表,不建索引,然后再导入新表,最后建索引,这样更好
minsic78 2018-03-28
  • 打赏
  • 举报
回复
引用 6 楼 wandier 的回复:
1000w,还敢这么操作,不怕事务日志满吗
数仓里千万级甚至上亿的表很常见的~ insert语句本身能优化的余地不多,append/append_values提示 + 表属性nologging是套路
wandier 2018-03-28
  • 打赏
  • 举报
回复
1000w,还敢这么操作,不怕事务日志满吗
qq_39394938 2018-03-19
  • 打赏
  • 举报
回复
大量插入数据要考虑好磁盘空间是否足够,表空间是否足够,是否要建立索引等
jdsnhan 2018-03-16
  • 打赏
  • 举报
回复
引用 3 楼 wmxcn2000 的回复:
for 这种方式,就好像别人借了你1万块钱,还你的时候,一块一块还,还一块钱,你记录了下,还欠我 9999,再还一块,你记录 还欠我 9998 。
+1 如果目标表是空,create table ... as select * from ...更快
卖水果的net 2018-03-16
  • 打赏
  • 举报
回复
for 这种方式,就好像别人借了你1万块钱,还你的时候,一块一块还,还一块钱,你记录了下,还欠我 9999,再还一块,你记录 还欠我 9998 。
MichellWu 2018-03-15
  • 打赏
  • 举报
回复
好的 我试一下
  • 打赏
  • 举报
回复
limit 设置为1000 - 5000左右 下面用 forall 方式 insert into 肯定是比第一种 快的

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧