Это первое, что я бы сделал, заменив SELECT *
только на те колонки, которые вам нужны. Вы также можете удалить производную таблицу M
, чтобы ее было легче читать:
UPDATE DL_RG_ANALYTICS.SH_historico
FROM (
SELECT CAST((MAX_DIA - DIA_PAGO) AS INTEGER) AS DIAS_AL_CIERRE_1
FROM DL_RG_ANALYTICS.SH_historico A
LEFT JOIN (
SELECT ANO || MES AS ANO_MES, MAX(DIA) AS MAX_DIA
FROM DL_RG_ANALYTICS.SH_CALENDARIO
GROUP BY 1
) B ON A.ANOMES = B.ANO_MES
) N
SET DIAS_AL_CIERRE = DIAS_AL_CIERRE_1;
Какие индексы определены в таблице SH_CALENDARIO
? Если есть составной индекс (ANO, MES
), то вам следует переписать ваш подзапрос LEFT JOIN
в GROUP BY
этих двух столбцах, так как вы все равно объединяете их вместе. Как правило, вы хотите выполнять объединения, функции GROUP BY
и OLAP
для индексов, поэтому будет меньше перераспределение строк, и они будут работать более эффективно.
Кроме того, этот запрос обновляет все строки в таблице с тем же значением. Это предназначено, или вы хотите включить дополнительные столбцы в ваше предложение WHERE
?