日期:2014-05-17  浏览次数:21146 次

存储过程里使用Commit的时机
oracle下,有个存储过程,里面有很多Insert、Update语句块,每次插入可能都在十几万行,现在的情况是在所有这些Insert和Update语句块后,做1个commit语句;
这样与每个Insert或Update语句后都写1个Commit,在效率上是否有什么差异?
方式一:
Insert into ...;
Commit;
Insert into ...;
Commit;
...
Update ...;
Commit;

方式二:
Insert into ...;
...
Insert into ...;
...
Update ...;
Commit;
两种方式,有何差异,请指导。
------解决方案--------------------
引用:
oracle下,有个存储过程,里面有很多Insert、Update语句块,每次插入可能都在十几万行,现在的情况是在所有这些Insert和Update语句块后,做1个commit语句;
这样与每个Insert或Update语句后都写1个Commit,在效率上是否有什么差异?
方式一:
Insert into ...;
Commit;
Insert into ...;
Commit;
.……

如果你确定每次都是十几万行的话,则如果每个INSERT/UPDATE语句后都COMMIT一次,这样效率很差的,因为COMMIT的时候,数据库需要做事务相关的操作,也要用时间的;
而你每次执行完十几万条INSERT/UPDATE后做一次COMMIT,也是不可取的;
比较习惯用的方法是:
每做完5000条或者1w条,或者2w条,做一次COMMIT,效率一定比“每个INSERT/UPDATE语句后都COMMIT一次”快。但是具体5000条快,还是1w条快,还是2w条快,不一定了,需要你做测试的。
------解决方案--------------------
根据业务需求确定一个合适的量,分批commit。

还有就是看你的业务是否需要用事务处理,要做好相应的策略
------解决方案--------------------
完成需求是第一位的,如,事务一致性
前面都commit了,后面的操作如果有错误,是否需要把前面的也rollback回来。
------解决方案--------------------
具体的要看具体的业务需求了,如果每个insert、update都commit了,那如果
有错误的话,如何rollback。
具体的效率高低:
一个要看执行的计划。
另外还要综合考虑磁盘I/O操作过于频繁也会降低效率的,如果每次insert一次或update一次
这样式写入多次,增加了磁盘的I/O操作的。