我在高交易金融系统工作。我们有一个表同时进行大量的事务更新。所有查询都经过优化,数据模型的结构可以灵活地支持并发。
我注意到的一个特殊问题是,在更新期间,如果我们运行在多行上运行SUM(balance)
函数的查询,则AWR报告显示在行锁中花费了57%的DB时间争。
根据我在Oracle锁定文档中读到的内容,没有读取可以获取行上的锁定并且可以安全地读取已提交的数据。如果需要成为SUM
函数一部分的行之一被Select for Update
语句锁定,那么读取查询是否需要等到锁定被释放?
如果没有读取查询,事务将以低至6%的争用结束。读取查询是否可能是CPU密集型的,并且由于CPU饥饿而导致争用?
我注意到当我们在运行期间运行读取查询时,CPU平均从20%上升到80%。
答案 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可能需要做的额外工作才能获得读数一致的数据视图。 (将块回滚到给定的时间点。)