搜索引擎一搜Oracle Sql优化,出来大量都差不多的文章,其中基本都提到了 “尽量多使用COMMIT”
但是貌似针对于ORACLE数据库是不适用的,oracle的技术总监 thomas曾经严厉批评过这种做法,有大侠能给具体分析下运作原理吗

解决方案 »

  1.   

    说要尽量多使用COMMIT的理由如下:
    只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:COMMIT所释放的资源:
      a. 回滚段上用于恢复数据的信息。
      b. 被程序语句获得的锁
      c. redo log buffer 中的空间
      d. ORACLE为管理上述3种资源中的内部花费
      

  2.   

    执行commit的时候,会把日志缓冲区和数据缓冲区的内容写入相应的文件中吧,频繁使用commit确实能不断释放空间,但是却造成硬盘的频繁写入。
    我只能理解到这个层次了
      

  3.   

    1)对于ORACLE来说,数据读取永远不会被数据写入所阻塞,数据写入也永远不会被数据读取阻塞(得益于优良的结构设计思想【锁,redo,undo等等】)。
    2)在ORACLE中,锁不是稀缺的资源,ORACLE使用最多的是行级锁,在ORACLE里1个行级锁何1000个行级锁消耗的资源是一样的。
    由上面两点,不用担心由于设计了大的事务而影响了并发性,比如在insert或者update的同时select的话,select不会被阻塞,依靠redo,undo,ORACLE可以返还一个正确的结果给你(不一定是最新的,即更新后的)
    这些是ORACLE与SQLSERVER等数据库设计思想上很大的不同点
    当然最后分成很多小事务来提交很明显会增大系统的压力
    ==============================================================
    以上纯属个人见解,如有错误请包涵 
      

  4.   

    感谢上面各位的回复,对于这个问题我特意去问了牛人,答案不敢独享,特别来分享下:
    "尽量多使用COMMIT"是错误的,oracle的技术总监 thomas曾经严厉批评过这种做法
     具体原因是因为oracle的commit一般会做4件事情,scn生成, 块清除,flush redo,释放undo
     而redo的flush,在整个事务的执行期间,会有lgwr进程不断的增量flush,所以不用担心commit时造成大量数据flush
     锁的问题在oracle里除了2PC阶段会有唯一的读阻塞外,其他情况下永远不会有读阻塞
     而且频繁的commit,会造成频繁的生成SCN,造成过多的undo,使一个长时间的select无法重建之前的数据版本
      

  5.   

    tom所说的是尽量在必要的时候提交事务,具体的要看你的实际情况来决定.
      

  6.   

    扣这些玩艺干什么???不明白
    使用commit的频次应该是跟程序的要求联系起来,总不能为了少使用commit,就让事务无限期地等待,直到推出程序的时候再commit吧。
    事务就是尽量地时间短,这才是第一原则。