可以读取查询导致Oracle

时间:2018-01-17 15:37:06

标签: oracle performance concurrency locking database-performance

我在高交易金融系统工作。我们有一个表同时进行大量的事务更新。所有查询都经过优化,数据模型的结构可以灵活地支持并发。

我注意到的一个特殊问题是,在更新期间,如果我们运行在多行上运行SUM(balance)函数的查询,则AWR报告显示在行锁中花费了57%的DB时间争。

根据我在Oracle锁定文档中读到的内容,没有读取可以获取行上的锁定并且可以安全地读取已提交的数据。如果需要成为SUM函数一部分的行之一被Select for Update语句锁定,那么读取查询是否需要等到锁定被释放?

如果没有读取查询,事务将以低至6%的争用结束。读取查询是否可能是CPU密集型的,并且由于CPU饥饿而导致争用?

我注意到当我们在运行期间运行读取查询时,CPU平均从20%上升到80%。

1 个答案:

答案 0 :(得分:1)

好的,首先,是你的阅读查询"一个SELECT FOR UPDATE?如果是这样,那么,这将导致锁定。 SELECT实际上是DML,而不仅仅是SELECT。它会执行行级锁定,并可能导致争用。

如果您的SELECT FOR UPDATE只是那个,而不是<p>operator:<input type="text" id="operator"></p> <p>column:<input type="text" id="columnName"></p> ,那么永远不会导致或被行级锁定阻止。

一个相关的想法,虽然你没有提到它,如果你在繁重的DML活动下查询一个表,你可能会看到查询性能相对于重DML不是时的查询性能降低发生了,这可能(可能)是由于Oracle的读一致性机制,以及Oracle可能需要做的额外工作才能获得读数一致的数据视图。 (将块回滚到给定的时间点。)