Oracle update特别慢,比insert慢很多很多

Evenque 2012-07-12 04:47:45
我用JDBC的PreparedStatement往Oracle的一个表里面插入数据和更新数据。
两个Connection创建两个PreparedStatement,一个用来执行insert另外一个用来执行update。
PreparedStatement使用批处理的方式,1000条commit一次。
表里面一共100W条数据,
执行3W条insert语句花了52秒;
执行3W条update语句花了1058秒。


表结构:
dept(deptno,dname,loc);
插入数据SQL:insert into TEST.DEPT(DEPTNO, DNAME, LOC) values (?, ?, ?)
更新数据SQL:update TEST.DEPT set DNAME = ?, LOC = ? where DEPTNO = ?

此表没有约束和索引。

请问,update为什么花这么长时间? 没更新1000条,花30-40秒。

...全文
5707 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
luckings 2012-07-14
  • 打赏
  • 举报
回复
如大家说的,插入没有索引是很快的,但修改由于没有索引,会进行全表扫描,增加扫描的开销,建议你对DEPTNO 字段增加索引。
另外,如果这个表经常update会有些碎片,也会影响到更新的速度,可以定期对表进行碎片整理,如在线重建索引等。
陈字文 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
请问,update为什么花这么长时间? 没更新1000条,花30-40秒。
-----------------------------------------------------------------
这个牵涉到Oracle的内部实现机制,一般来说,insert只需要为新记录找到一个可插入的地方,然后将记录数据按照内部格式复制到对应的位置就可以了,加上你的表没有索引,因此也没有索引操作的……
[/Quote]



+1
wqkjj 2012-07-14
  • 打赏
  • 举报
回复
请问,update为什么花这么长时间? 没更新1000条,花30-40秒。
-----------------------------------------------------------------
这个牵涉到Oracle的内部实现机制,一般来说,insert只需要为新记录找到一个可插入的地方,然后将记录数据按照内部格式复制到对应的位置就可以了,加上你的表没有索引,因此也没有索引操作的时间消耗,所以快;对于update而言,多了很多操作,简单而言,
(1)因为没有索引,因此,需要更新前先需要通过全表扫描的方式来定位记录,这大概会消耗掉你所提的大部份时间;所以楼上有人建议你更新前先建合适的索引;
(2)需要为旧记录数据复制到称为回滚段的地方,以便保证数据可以正确回滚,因此,这里实际至少要处理两条记录的插入操作,就这点上,会比insert耗时在两倍以上;
(3)因为update可能会导致原记录所在页的空间不够存放新的数据,因此,需要将更新后的记录“迁移”到另外的数据页上,而这种迁移处理是非常耗时的。为了减少迁移发生,所以L3建议你增大PCTFREE的值。
hhq201 2012-07-13
  • 打赏
  • 举报
回复
建表的PCTFree 和PCTUsed 参数设置,看看能不能改动下。update应该增大PCTFree
Evenque 2012-07-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 1 楼 的回复:
必然update比insert慢呀,insert没有主键情况下直接插入,速度很快,update要先去找到对应记录,在更新,你把DEPTNO建个索引,就会快很多了
说的很对,建议楼主加索引!
[/Quote]
做OLAP用的数据库,不加任何约束。
1惯親手 2012-07-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
必然update比insert慢呀,insert没有主键情况下直接插入,速度很快,update要先去找到对应记录,在更新,你把DEPTNO建个索引,就会快很多了
[/Quote]说的很对,建议楼主加索引!
liuyangccu 2012-07-12
  • 打赏
  • 举报
回复
必然update比insert慢呀,insert没有主键情况下直接插入,速度很快,update要先去找到对应记录,在更新,你把DEPTNO建个索引,就会快很多了

17,133

社区成员

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

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