尝试更新时 Teradata 中不再有假脱机 space

No more spool space in Teradata while trying Update

我正在尝试更新一个 table 有很多行 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;

感谢任何帮助。

我要做的第一件事是仅将 SELECT * 替换为您需要的列。您还可以删除 M 派生的 table 以使其更易于阅读:

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 table 上定义了哪些索引?如果有 (ANO, MES) 的复合索引,那么您应该将 LEFT JOIN 子查询重写为 GROUP BY 这两列,因为您无论如何都将它们连接在一起。通常,您希望在索引上执行连接、GROUP BYOLAP 函数,这样行重新分配会更少,它们会 运行 更有效。

此外,此查询正在使用相同的值更新 table 中的所有行。这是故意的,还是您想在 WHERE 子句中包含额外的列?