Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

69

积分

0

好友

13

主题
1#
发表于 2012-6-28 16:14:44 | 查看: 11272| 回复: 3
听说bulk into 能减少SQL和PLSQL之间的切换! 可本公司采用这样的写法

cur cur_mms_send is
--返回数量有500万行

select provcode from table_a
open cur_mms_send;
loop
   
fetch cur_detail bulk collect into
     l_ary_provcode_tmp1
    limit
10000;
   
   forall i
in
1..l_ary_provcode_tmp1.count
insert
into sms_down
    (
        provcode
       )
   
values
    (      l_ary_provcode_tmp1(i)    );   
commit;
   
exit
when cur_mms_send%notfound or cur_mms_send%notfound is
null;            
   
end loop;  
   
close cur_mms_send;

上面本来可以用一条语句实现
Insert into sms_down
select provcode from table_a ;
而且也没有发生PLSQL 和SQL的切换.

据另个同事说 1 这样因为LIMIT可以减少对PGA的使用量. 2 forall .....  insert into ... commit; 可以把大事务分批提交,减少对UNDO空间使用量.

不知说得是否正确?
2#
发表于 2012-6-29 09:18:54
多谢 多谢! 先消化下

回复 显示全部楼层 道具 举报

3#
发表于 2012-6-29 15:34:10
为什么 使用FOR ALL的代价是消耗大量的PGA内存 ? 它消耗PGA哪个部分?

像上面 采用了LIMITE 方法 相对直接Insert into 语句 对UNDO空间来说 占用量比较小,因为采用分批提交,UNDO占用了会很快释放掉?

FORALL 为什么大量减少REDO呢?

回复 显示全部楼层 道具 举报

4#
发表于 2012-6-29 15:41:22
NAME                                                                  VALUE
---------------------------------------------------------------- ----------
CPU used by this session                                                103
redo size                                                            260168
undo change vector size                                               57544

insert /*+ append */  into maclean_forall2 select * from maclean_forall


直接的会少那么多UNDO 和REDO  太不可思议了

回复 显示全部楼层 道具 举报

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

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-5-4 08:32 , Processed in 0.044946 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569