sql交叉联接替代

时间:2020-07-03 18:22:25

标签: sql performance

从性能的角度来看,我需要知道是否有更好/优化的方式来编写此子查询。实际上,我认为这是实现更好的联接的问题。

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 )

1 个答案:

答案 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)上建立索引。

相关问题