优化更新语句 - 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.
我正在尝试 运行 以下更新,但继续 运行 假脱机 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.