Oracle Sql优化Commit提交问题 搜索引擎一搜Oracle Sql优化,出来大量都差不多的文章,其中基本都提到了 “尽量多使用COMMIT”但是貌似针对于ORACLE数据库是不适用的,oracle的技术总监 thomas曾经严厉批评过这种做法,有大侠能给具体分析下运作原理吗 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 说要尽量多使用COMMIT的理由如下:只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:COMMIT所释放的资源: a. 回滚段上用于恢复数据的信息。 b. 被程序语句获得的锁 c. redo log buffer 中的空间 d. ORACLE为管理上述3种资源中的内部花费 执行commit的时候,会把日志缓冲区和数据缓冲区的内容写入相应的文件中吧,频繁使用commit确实能不断释放空间,但是却造成硬盘的频繁写入。我只能理解到这个层次了 1)对于ORACLE来说,数据读取永远不会被数据写入所阻塞,数据写入也永远不会被数据读取阻塞(得益于优良的结构设计思想【锁,redo,undo等等】)。2)在ORACLE中,锁不是稀缺的资源,ORACLE使用最多的是行级锁,在ORACLE里1个行级锁何1000个行级锁消耗的资源是一样的。由上面两点,不用担心由于设计了大的事务而影响了并发性,比如在insert或者update的同时select的话,select不会被阻塞,依靠redo,undo,ORACLE可以返还一个正确的结果给你(不一定是最新的,即更新后的)这些是ORACLE与SQLSERVER等数据库设计思想上很大的不同点当然最后分成很多小事务来提交很明显会增大系统的压力==============================================================以上纯属个人见解,如有错误请包涵 感谢上面各位的回复,对于这个问题我特意去问了牛人,答案不敢独享,特别来分享下:"尽量多使用COMMIT"是错误的,oracle的技术总监 thomas曾经严厉批评过这种做法 具体原因是因为oracle的commit一般会做4件事情,scn生成, 块清除,flush redo,释放undo 而redo的flush,在整个事务的执行期间,会有lgwr进程不断的增量flush,所以不用担心commit时造成大量数据flush 锁的问题在oracle里除了2PC阶段会有唯一的读阻塞外,其他情况下永远不会有读阻塞 而且频繁的commit,会造成频繁的生成SCN,造成过多的undo,使一个长时间的select无法重建之前的数据版本 tom所说的是尽量在必要的时候提交事务,具体的要看你的实际情况来决定. 扣这些玩艺干什么???不明白使用commit的频次应该是跟程序的要求联系起来,总不能为了少使用commit,就让事务无限期地等待,直到推出程序的时候再commit吧。事务就是尽量地时间短,这才是第一原则。 请问oracle的异机数据库恢复条件~! 关于oracle 字段是blob的问题 select 列显示的问题 OracleOraHome92ClientCache 服务启动不了 oracle 文档发? 为什么我的for循环无法执行进去啊,游标不怎么会用,还请各位帮忙看看啊 oracle中的emp表是不是不能修改?怎样能修改它?能看到update结果? 40个人上机学 Oracle,上机环境应该怎么搭? SQL Server数据库导入到Oracle中却不能用,求助! plsql:创建函数报错!错误信息:ORA-01031: 权限不足 oracle8i 为什么查询速度这么慢
只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:COMMIT所释放的资源:
a. 回滚段上用于恢复数据的信息。
b. 被程序语句获得的锁
c. redo log buffer 中的空间
d. ORACLE为管理上述3种资源中的内部花费
我只能理解到这个层次了
2)在ORACLE中,锁不是稀缺的资源,ORACLE使用最多的是行级锁,在ORACLE里1个行级锁何1000个行级锁消耗的资源是一样的。
由上面两点,不用担心由于设计了大的事务而影响了并发性,比如在insert或者update的同时select的话,select不会被阻塞,依靠redo,undo,ORACLE可以返还一个正确的结果给你(不一定是最新的,即更新后的)
这些是ORACLE与SQLSERVER等数据库设计思想上很大的不同点
当然最后分成很多小事务来提交很明显会增大系统的压力
==============================================================
以上纯属个人见解,如有错误请包涵
"尽量多使用COMMIT"是错误的,oracle的技术总监 thomas曾经严厉批评过这种做法
具体原因是因为oracle的commit一般会做4件事情,scn生成, 块清除,flush redo,释放undo
而redo的flush,在整个事务的执行期间,会有lgwr进程不断的增量flush,所以不用担心commit时造成大量数据flush
锁的问题在oracle里除了2PC阶段会有唯一的读阻塞外,其他情况下永远不会有读阻塞
而且频繁的commit,会造成频繁的生成SCN,造成过多的undo,使一个长时间的select无法重建之前的数据版本
使用commit的频次应该是跟程序的要求联系起来,总不能为了少使用commit,就让事务无限期地等待,直到推出程序的时候再commit吧。
事务就是尽量地时间短,这才是第一原则。