200w 数据处理问题

williamwilliam 2012-04-08 10:20:19
写了一个存储过程 功能是 把a表中的数据 行列转到b表上 其中从a表取出的数据再存储过程中要做些处理和判断
我是用游标来逐条读取a表中的200w数据。

问题是 执行这个存储过程 时间非常长要2小时才执行完,commit后去b表查,发现有许多数据没有存进来。
请问 是系统内存有限制 导致不能一次commit 要分开commit 还是其他原因?
...全文
208 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
larrychen_bmw 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

对于数据库大批量数据处理,特别是需要插入到另外一个表,肯定是要批处理才会快。
你通过游标一条条的处理你有多少条记录在数据库里就要做多少次上下文切换,而上下文切换是很耗时的
建议你将数据通过游标分批的赋给联合数组,通过联合数组来批处理数据。这样可以减少上下文切换的次数,从而提高效率。
[/Quote]




“发现有许多数据没有存进来”这个跟数据库内存无关。这个问题建议检查一下是否程序逻辑导致的
一次commit也是可行的

下面是一个使用 for all insert 和 使用 bulk collect的例子,供参考


DECLARE
CURSOR s_cur IS
SELECT *
FROM servers;
 
TYPE fetch_array IS TABLE OF s_cur%ROWTYPE;
s_array fetch_array;
BEGIN
OPEN s_cur;
LOOP
FETCH s_cur BULK COLLECT INTO s_array LIMIT 1000;
 
FORALL i IN 1..s_array.COUNT
INSERT INTO servers2 VALUES s_array(i);
 
EXIT WHEN s_cur%NOTFOUND;
END LOOP;
CLOSE s_cur;
COMMIT;
END;
/



kingkingzhu 2012-04-08
  • 打赏
  • 举报
回复
逐条提交 性能不好
一次提交 应该也就是吃内存 不会导致丢失数据啊
oracle自身有很多机制 会触发写数据
丢失数据的问题 不好说 自己跟踪下丢失的数据吧
mailking 2012-04-08
  • 打赏
  • 举报
回复
对于数据库大批量数据处理,特别是需要插入到另外一个表,肯定是要批处理才会快。
你通过游标一条条的处理你有多少条记录在数据库里就要做多少次上下文切换,而上下文切换是很耗时的
建议你将数据通过游标分批的赋给联合数组,通过联合数组来批处理数据。这样可以减少上下文切换的次数,从而提高效率。
ssqtjffcu 2012-04-08
  • 打赏
  • 举报
回复
可以分批commit;花费的这么长时间要看你的数据和过程是怎么的
zhaohongbo84 2012-04-08
  • 打赏
  • 举报
回复
这种问题是不是需要 pro C 来处理,更好一些 ~

raymonshi 2012-04-08
  • 打赏
  • 举报
回复
如果是逐条处理的,怎么不逐条提交呢?
逐条处理能不能改为批量处理,200w的数据量,够多的。

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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