Нет больше места в буфере Teradata при попытке обновления - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь обновить таблицу до 388.000 строк.

Это запрос:

update DL_RG_ANALYTICS.SH_historico
from 
(
SELECT
    CAST((MAX_DIA - DIA_PAGO) AS INTEGER) AS DIAS_AL_CIERRE_1
FROM

(SELECT * 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
) M) N

SET DIAS_AL_CIERRE = DIAS_AL_CIERRE_1;

Любая помощь является устаревшей.

1 Ответ

0 голосов
/ 08 января 2020

Это первое, что я бы сделал, заменив 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?

...