Кто-то на работе сделал это ОБНОВЛЕНИЕ несколько лет назад, и это работает, проблема в том, что он занимает почти 5 часов, когда вызывается несколько раз в процессе, это не регулярное ОБНОВЛЕНИЕ, нет записи от 1 до 1 сопоставление между таблицами, это делает обновление, основанное на накоплении (SUM) поля parituclar в той же таблице, и все усложняется, поскольку этот SUM ограничен особыми условиями на основе дат и другого поля.Оптимизация сложного SQL-обновления
Я думаю, что это что-то вроде (неявного) внутреннего соединения без соответствия 1 к 1, как ВСЕ ВС ВСЕ, поэтому, имея, например, 7000 записей в таблице, эта вещь будет обрабатывать 7000 * 7000 записей, более 55 миллион, на мой взгляд, курсоры должны были использоваться здесь, но теперь мне нужно больше скорости, и я не думаю, что курсоры меня доставят.
Мой вопрос: есть ли способ переписать это и сделать его быстрее? Обратите внимание на условия на этом SUM, это не просто увидеть UPDATE (по крайней мере, для меня).
Подробнее: 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
вы не возражаете давая картину плана запроса? – Martin
Скриншот прилагается – Jcis
Какие индексы у вас есть в таблице? Это поможет, если вы добавите оператор 'CREATE TABLE'. –