代码之家  ›  专栏  ›  技术社区  ›  N91

sql交叉连接替代方案

  •  0
  • N91  · 技术社区  · 5 年前

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

    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 回复  |  直到 5 年前
        1
  •  0
  •   Gordon Linoff    5 年前

    切换到正确的模式 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) .