我有一张POS表格。每次交易后,我需要更新POS余额。但是,当我频繁执行特定POS的更新SQL时,更新语句将花费很长时间。您能建议我怎样减少更新时间?
我已经使用/ * +并行(自动)* /了,但是没有任何进展!
update pos_station
set balance = balance - #balance#
where posid = #posId#
posid
是pos_station
表的主键。
下面是我的表格详细信息: enter image description here
答案 0 :(得分:0)
对于此查询:
update pos_station
set balance = balance - #balance#
where posid = #posId#;
您要在pos_status(posid)
上建立索引。
答案 1 :(得分:0)
“当我频繁执行特定POS的更新SQL时,更新语句将花费很长时间”
这听起来不像是性能问题,而更像是糟糕的交易设计。尝试更新同一行的多个会话将相互阻塞。锁定该行的第一个会话将阻止所有其他会话,从而导致它们挂起。 “长时间”既不是更新本身也不是查找记录的查找时间:它是等待获得锁以应用更新的等待时间。并行处理不会改善这种情况。
对于解决方案,具体细节取决于您的应用程序体系结构。将余额更新排队并在后台进程中应用它们可能是合适的。使用SELECT…FOR UPDATE语法引入悲观锁定策略可能是适当的。也许您需要使用较小的工作单元重新设计事务,以便您更频繁地提交,这意味着更新将锁保持的时间更短。不幸的是,您的问题缺少足够的细节,无法为我们提供具体建议。