sql交叉连接替代方案

mqkwyuun  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(398)

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

  1. SELECT SE.TOUCHPOINT_ID, SE.TOUCHPOINT_DATE,
  2. COALESCE(AC.COST_VAR_PER_SESSION, 0) + COALESCE(MC.COST_VAR_PER_SESSION, 0) AS COST_VAR_PER_SESSION,
  3. COALESCE(AC.COST_FIX_PER_SESSION, 0) + COALESCE(MC.COST_FIX_PER_SESSION, 0) AS COST_FIX_PER_SESSION
  4. FROM MLOGIC.ATTR.MARKETING_TOUCHPOINTS SE, MLOGIC.COST.AD_COST_DISTRIBUTION AC, MLOGIC.COST.SOURCE_MEDIUM_COST_DISTRIBUTION MC
  5. WHERE SE.TOUCHPOINT_DATE = AC.TOUCHPOINT_DATE
  6. AND SE.AD_ID = AC.AD_ID
  7. AND SE.TOUCHPOINT_DATE = MC.TOUCHPOINT_DATE
  8. AND SE.MEDIUM_ID = MC.MEDIUM_ID
  9. AND SE.TOUCHPOINT_ID NOT IN (SELECT * FROM LEAD_EVENTS )
ygya80vv

ygya80vv1#

切换到正确位置 JOIN 语法可能不会改变性能。但是,它将使查询更易于理解和维护。
另一方面,切换 NOT INNOT EXISTS 可能会提高性能。所以我建议:

  1. SELECT . . .
  2. FROM MLOGIC.ATTR.MARKETING_TOUCHPOINTS SE JOIN
  3. MLOGIC.COST.AD_COST_DISTRIBUTION AC
  4. ON SE.TOUCHPOINT_DATE = AC.TOUCHPOINT_DATE AND
  5. SE.AD_ID = AC.AD_ID JOIN
  6. MLOGIC.COST.SOURCE_MEDIUM_COST_DISTRIBUTION MC
  7. ON SE.TOUCHPOINT_DATE = MC.TOUCHPOINT_DATE AND
  8. SE.MEDIUM_ID = MC.MEDIUM_ID
  9. WHERE NOT EXISTS (SELECT 1
  10. FROM LEAD_EVENTS LE
  11. WHERE LE.TOUCHPOINT_ID = SE.TOUCHPOINT_ID -- guessing on the name of the column
  12. );

对于这个,你需要一个索引 LEAD_EVENTS(TOUCHPOINT_ID) .

展开查看全部

相关问题