优化更新语句 - Teradata

Optimizing an update statement - Teradata

我正在尝试 运行 以下更新,但继续 运行 假脱机 space 问题。有什么办法可以优化吗?

UPDATE  dp_wedw_snd.platinumsaves
SET package_name = (SELECT package_name
                    FROM dp_wedw_snd.selfpaysubs_agid_platsaves
                    WHERE trim(dp_wedw_snd.platinumsaves.esn1) = trim(cast(dp_wedw_snd.selfpaysubs_agid_platsaves.esn as varchar(255)))
                    and     abs(dp_wedw_snd.platinumsaves.shortdate - dp_wedw_snd.selfpaysubs_agid_platsaves.dateasof) = 
                            (select min(abs(dp_wedw_snd.platinumsaves.shortdate - dp_wedw_snd.selfpaysubs_agid_platsaves.dateasof)) 
                            from dp_wedw_snd.platinumsaves, dp_wedw_snd.selfpaysubs_agid_platsaves)
                    )
                    WHERE 
                    EXISTS(SELECT  esn
                    FROM dp_wedw_snd.selfpaysubs_agid_platsaves
                    WHERE trim(dp_wedw_snd.platinumsaves.esn1) =trim(cast(dp_wedw_snd.selfpaysubs_agid_platsaves.esn as varchar(255)))
                    );

这个查询有几个问题。

  • from dp_wedw_snd.platinumsaves, dp_wedw_snd.selfpaysubs_agid_platsaves 导致交叉连接。
  • TRIM 上的连接真的很糟糕,dp_wedw_snd.platinumsaves.esn1 中真的有前导空格吗?
  • dp_wedw_snd.selfpaysubs_agid_platsaves.esn 是数字列吗?为什么?为什么你也 TRIM 它?

这个查询应该做同样的事情(删除交叉连接并将 MIN 重写为 QUALIFY):

UPDATE dp_wedw_snd.platinumsaves
FROM
 ( 
   SELECT package_name, esn
   FROM dp_wedw_snd.platinumsaves AS ps JOIN dp_wedw_snd.selfpaysubs_agid_platsaves AS sap
     ON TRIM(ps.esn1) = TRIM(CAST(sap.esn AS VARCHAR(255)))
   QUALIFY ROW_NUMBER() OVER (PARTITION BY ps.esn1 ORDER BY ABS(ps.shortdate - sap.dateasof)) = 1
 ) AS src
SET package_name = src.package_name
WHERE TRIM(dp_wedw_snd.platinumsaves.esn1) = TRIM(CAST(src.esn AS VARCHAR(255)))

当然你应该测试它是否完全相同。并检查是否可以摆脱 TRIM.