Sql优化(八):程序的可扩展性----direct insert的副作用

本篇继续介绍不合理设计导致程序可扩展性差的例子。 数据库运行出账程序时,出现enq: TM - contention等待事件,主要原因是多个进程在insert bill_invoice_*时,使用了insert /*+ append*/这一方式,本来想通过append即direct insert方式提升速度,结果产生表级锁。这样开帐进程相互等待,实际上是变成串行的操作了,反而影响了速度。更严重的是,如果是生产系统,还会导致账单表上所有修改操作都无法进行,影响其他重要业务,这个后果就很严重了。[@more@]

Direct insert这一用法有其速度快的优点,但也有其缺点,必须注意适用场合。大家想一下,为什么oracle不默认用append呢?
这里总结一下,direct-load insert(及append,direct方式sqlldr等)适合于:
1)大量记录的insert时使用会提升速度,因为绕过databuffer直接访问数据文件,且不用扫描原有block上哪些有剩余空间,而直接分配新空间
2)单个进程,通常是数据维护时,或者临时倒数据等
这两种情况下,使用direct-load insert不仅速度快,还减少了数据库data buffer的使用,对数据库上的其他应用产生的影响也较小。

不适合:
1)少量记录insert。因为每次insert /*+append */后会进行索引维护,少量记录insert使用append反而慢。
2)多用户,OLTP环境。因为append会产生表级锁。OLTP系统除了一些批处理操作,大多数应用都不应该使用append。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/18474/viewspace-1060738/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/18474/viewspace-1060738/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值