【问题标题】:No more spool space in Teradata while trying Update尝试更新时 Teradata 中没有更多的假脱机空间
【发布时间】:2020-04-26 04:54:48
【问题描述】:

我正在尝试更新具有多行 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;

任何帮助都是不胜感激的。

【问题讨论】:

  • DL_RG_ANALYTICS.SH_historico (dias_al_cierre) 上的主索引可能会有所帮助。

标签: teradata teradata-sql-assistant


【解决方案1】:

我要做的第一件事是仅将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 BYOLAP 函数,这样会减少行重新分配并且它们会更高效地运行。

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

【讨论】:

    猜你喜欢
    • 2020-04-26
    • 2021-09-07
    • 2019-09-12
    • 2012-09-10
    • 2018-07-16
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多