職場の誰かが数年前にこの UPDATE を作成しましたが、うまくいきました。問題は、プロセスで複数回呼び出されたときにほぼ 5 時間かかることです。これは通常の UPDATE ではありません。テーブル間で 1 対 1 のレコードの一致はありません。同じテーブル内の特定のフィールドの累積 (SUM) に基づいて更新すると、この SUM は日付と別のフィールドに基づく特別な条件に制限されるため、事態はさらに複雑になります。
これは、ALL VS ALL のように、1 対 1 の一致がない (暗黙の) 内部結合のようなものだと思います。たとえば、テーブルに 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