对于影响零行的更新,哪个过程更有效?
UPDATE table SET column = value WHERE id = number;
IF SQL%Rowcount > 0 THEN
COMMIT;
END IF;
或
UPDATE table SET column = value WHERE id = number;
COMMIT;
换句话说,如果更新影响ZERO行并发出提交,我是否会产生任何额外费用?
我有一个系统受到日志文件同步等待的阻碍......我想知道是否发出提交;针对影响零行的事务,会将该语句写入日志,从而导致更多LGWR争用。
答案 0 :(得分:5)
COMMIT
会强制日志文件同步,因此系统必须等待。
然而,ROLLBACK
也会这样做,并且在某些时候它们中的任何一个都必须发生。
因此,如果您既不发出COMMIT
也不发出ROLLBACK
,那么您只是暂停一个开放的交易,迟早将导致日志同步等待。
您可能希望批处理UPDATE
次操作,而不是等待第一次成功更新并提交。
答案 1 :(得分:3)
这有风险。从技术上讲,虽然UPDATE可能会影响零行,但它可以在表上的更新触发器之前或之后触发(而不是在行级别)。这些触发器可能“做某事”需要提交/回滚。
更安全地查看是否设置了LOCAL_TRANSACTION_ID。
答案 2 :(得分:-1)
有许多理由可以成为等待log file sync
的基础。主要罪魁祸首似乎不太可能提交更新了零行的SQL语句。确实,发出太多提交可能是导致此问题的原因。例如,如果应用程序设置为在每个语句之后提交(例如,通过使用AUTOCOMMIT = TRUE),而不是设计正确的事务。如果这是原因,那么除了对应用程序进行重大改写之外,您无能为力。
如果您想深入研究问题的根本原因,我建议您阅读Pythian的Riyaj Shamsudeen在Tuning ‘log file sync’ Event Waits上阅读这篇详尽(且令人筋疲力尽)的文章。