oracle批量提交,autocommit设置

dut703 2010-10-11 11:35:52
各位大虾,从一个表A中,更新数据到表B。A表的数据来自周边系统给的数据文件,正式上线时每天获取增量数据,
数据量不大。
第一次上线时,要拿一份全量数据,数量级有将近3000万,并且A表是一个很大的表,有80多个字段。
因此第一次上线时,用A表更新B表,数据量很大。
db为oracle 9i
默认autocommit为off
我就想设置自动提交。
大概过程如下:
set autocommit on;
set autocommit 200000;
insert /*+ append */ into A nologging
select column_name
from B
;
commit;
set autocommit off;
执行时,我一直在观察A所在的空闲表空间TABLESPACE_A大小。TABLESPACE_A的大小一直在减小,过了片刻,大小不再变化。
此时程序停顿在那里,undo表空间和索引表空间的空闲空间大小也开始减少。
此时查询A表状态,A表上有6级锁,这个正常,append时加6级锁。
但是查询A表中的数据,一直为0。
然后程序又运行了一段时间,A中的数据一直为0。
我设置的autocommit 200000一点用处都没。
本人菜鸟,忘不吝赐教。
...全文
987 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
碧水幽幽泉 2010-10-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gelyon 的回复:]
append方式批量添加记录,不会减少索引上产生的redo数量,索引上的redo数量可能比表的redo数量还要大
一般批量数据的insert采用先drop index ,表设置为nologging,然后append,最后重建index
[/Quote]
这个方案不错!
dut703 2010-10-12
  • 打赏
  • 举报
回复
恩,这个是第一次上线时用下,第一次运行的时候,别的系统给一个全量数据,比较大。
专门写一个sql来跑。
以后每天是跑增量,数据不大,有另外的存储过程跑,直接append插入,速度还可以。
gelyon 2010-10-12
  • 打赏
  • 举报
回复
append方式批量添加记录,不会减少索引上产生的redo数量,索引上的redo数量可能比表的redo数量还要大
一般批量数据的insert采用先drop index ,表设置为nologging,然后append,最后重建index
dut703 2010-10-12
  • 打赏
  • 举报
回复
HP UNIX环境,
我写了一个a.sql,大概这样
set autocommit on;
set autocommit 200000;
insert /*+ append */ into A nologging
select column_name
from B
;
commit;
set autocommit off;
然后在unix下使用sqlplus -S name/ps@dbname<a.sql执行,
速度很慢,我观察了表空间大小变化。
刚开始10分钟左右,目标表所在的表空间一直在写数据。之后不再变化。
index表空间开始缓慢增长,undo表空间也持续增长。这个过程比较缓慢,大概50多分钟。
之后程序运行结束。
表比较大,还是个宽表,80多个字段,将近3000万的数据。

我后来改进了,首先drop index,然后append插入,之后重建主键和索引,
速度快多了,不到20分钟就完成了。

在网上也查了下,说如果表上有索引,则append方式批量添加记录,不会减少索引上产生的redo数量,索引上的redo数量可能比表的redo数量还要大。个人认为可能是这个原因。
心中的彩虹 2010-10-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 dut703 的回复:]
各位大虾,从一个表A中,更新数据到表B。A表的数据来自周边系统给的数据文件,正式上线时每天获取增量数据,
数据量不大。
第一次上线时,要拿一份全量数据,数量级有将近3000万,并且A表是一个很大的表,有80多个字段。
因此第一次上线时,用A表更新B表,数据量很大。
db为oracle 9i
默认autocommit为off
我就想设置自动提交。
大概过程如下:
set autoco……
[/Quote]
什么环境操作的
Phoenix_99 2010-10-12
  • 打赏
  • 举报
回复
在cmd中,可以自动提交
SQL> show autocommit;
autocommit OFF
SQL> set autocommit on;
SQL> insert into t values(1);

已创建 1 行。

提交完成。
SQL>

在sql/develop中不可以自动提交

17,140

社区成员

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

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