从性能的角度来看,我需要知道是否有更好/优化的方式来编写此子查询。实际上,我认为这是实现更好的联接的问题。
SELECT SE.TOUCHPOINT_ID, SE.TOUCHPOINT_DATE,
COALESCE(AC.COST_VAR_PER_SESSION, 0) + COALESCE(MC.COST_VAR_PER_SESSION, 0) AS COST_VAR_PER_SESSION,
COALESCE(AC.COST_FIX_PER_SESSION, 0) + COALESCE(MC.COST_FIX_PER_SESSION, 0) AS COST_FIX_PER_SESSION
FROM MLOGIC.ATTR.MARKETING_TOUCHPOINTS SE, MLOGIC.COST.AD_COST_DISTRIBUTION AC, MLOGIC.COST.SOURCE_MEDIUM_COST_DISTRIBUTION MC
WHERE SE.TOUCHPOINT_DATE = AC.TOUCHPOINT_DATE
AND SE.AD_ID = AC.AD_ID
AND SE.TOUCHPOINT_DATE = MC.TOUCHPOINT_DATE
AND SE.MEDIUM_ID = MC.MEDIUM_ID
AND SE.TOUCHPOINT_ID NOT IN (SELECT * FROM LEAD_EVENTS )
答案 0 :(得分:0)
切换为正确的JOIN
语法可能不会改变性能。但是,这将使查询更易于理解和维护。
另一方面,将NOT IN
切换为NOT EXISTS
可能会提高性能。所以我建议:
SELECT . . .
FROM MLOGIC.ATTR.MARKETING_TOUCHPOINTS SE JOIN
MLOGIC.COST.AD_COST_DISTRIBUTION AC
ON SE.TOUCHPOINT_DATE = AC.TOUCHPOINT_DATE AND
SE.AD_ID = AC.AD_ID JOIN
MLOGIC.COST.SOURCE_MEDIUM_COST_DISTRIBUTION MC
ON SE.TOUCHPOINT_DATE = MC.TOUCHPOINT_DATE AND
SE.MEDIUM_ID = MC.MEDIUM_ID
WHERE NOT EXISTS (SELECT 1
FROM LEAD_EVENTS LE
WHERE LE.TOUCHPOINT_ID = SE.TOUCHPOINT_ID -- guessing on the name of the column
);
为此,您需要在LEAD_EVENTS(TOUCHPOINT_ID)
上建立索引。