如何在Oracle中优化更新SQL以连续更新特定行

时间:2019-04-15 10:48:55

标签: sql oracle

我有一张POS表格。每次交易后,我需要更新POS余额。但是,当我频繁执行特定POS的更新SQL时,更新语句将花费很长时间。您能建议我怎样减少更新时间?

我已经使用/ * +并行(自动)* /了,但是没有任何进展!

update pos_station
set balance = balance - #balance#
where posid = #posId#

posidpos_station表的主键。

下面是我的表格详细信息: enter image description here

2 个答案:

答案 0 :(得分:0)

对于此查询:

update pos_station
    set balance = balance - #balance#
    where posid = #posId#;

您要在pos_status(posid)上建立索引。

答案 1 :(得分:0)

  

“当我频繁执行特定POS的更新SQL时,更新语句将花费很长时间”

这听起来不像是性能问题,而更像是糟糕的交易设计。尝试更新同一行的多个会话将相互阻塞。锁定该行的第一个会话将阻止所有其他会话,从而导致它们挂起。 “长时间”既不是更新本身也不是查找记录的查找时间:它是等待获得锁以应用更新的等待时间。并行处理不会改善这种情况。

对于解决方案,具体细节取决于您的应用程序体系结构。将余额更新排队并在后台进程中应用它们可能是合适的。使用SELECT…FOR UPDATE语法引入悲观锁定策略可能是适当的。也许您需要使用较小的工作单元重新设计事务,以便您更频繁地提交,这意味着更新将锁保持的时间更短。不幸的是,您的问题缺少足够的细节,无法为我们提供具体建议。