几年前有人在工作中进行了此更新并且它有效,问题是在一个进程中多次调用它需要将近 5 个小时,这不是常规更新,表之间没有 1 对 1 的记录匹配,这是一个基于同一个表中的 parituclar 字段的累积 (SUM) 进行更新,事情变得更加复杂,因为这个 SUM 仅限于基于日期和另一个字段的特殊条件。
我认为这类似于(隐式)内部联接,没有 1 对 1 匹配,例如 ALL VS ALL,因此当表中有 7000 条记录时,这个东西将处理 7000 * 7000 条记录,超过 5500 万条,在我的意见游标应该在这里使用,但现在我需要更快的速度,我认为游标不会让我到达那里。
我的问题是:有没有办法重写它并让它更快?注意那个 SUM 的条件,这不是一个容易看到的更新(至少对我来说)。
更多信息: CodCtaCorriente 和 CodCtaCorrienteMon 是此表上的主键,但正如我之前所说,此处无意进行 1 对 1 匹配,这就是为什么在查询中不使用此键的原因,CodCtaCorrienteMon 用于条件但不用作加入条件(ON)。
UPDATE #POS SET SaldoDespuesEvento =
(SELECT SUM(Importe)
FROM #POS CTACTE2
WHERE CTACTE2.CodComitente = #POS.CodComitente
AND CTACTE2.CodMoneda = #POS.CodMoneda
AND CTACTE2.EstaAnulado = 0
AND (DATEDIFF(day, CTACTE2.FechaLiquidacion, #POS.FechaLiquidacion) > 0
OR
(DATEDIFF(day, CTACTE2.FechaLiquidacion, #POS.FechaLiquidacion) = 0
AND (#POS.CodCtaCorrienteMon >= CTACTE2.CodCtaCorrienteMon))))
WHERE #POS.EstaAnulado = 0 AND #POS.EsSaldoAnterior = 0