左内连接与OR操作符-替代?



我试图在ON子句中执行(在雪花中)一个带有OR操作符的左INNER JOIN,但查询需要很长时间才能运行。我的问题是,在我的特定情况下,是否有替代方案或任何其他选项使查询执行得更快?下面的查询:

SELECT T1.EMAIL,
M.STATUS,
M.CAMPAIGN_ID,
M.CAMPAIGN_TYPE
FROM (SELECT VISITOR_ID,
ACCOUNT_ID,
CONTACT_ID,
ROW_KEY,
LEAD_ID,
EMAIL,
CAMPAIGN_UNIQUE_ID
FROM NORMAL_TOUCHPOINTS NTP
UNION ALL
SELECT VISITOR_ID,
ACCOUNT_ID,
CONTACT_ID,
ROW_KEY,
NULL AS LEAD_ID,
EMAIL,
CAMPAIGN_ID
FROM OPP_TOUCHPOINTS OTP) T1
JOIN LIST_FACTS LF ON (LF.TP_KEY = T1.ROW_KEY) OR (LF.ATP_KEY = T1.ROW_KEY)
LEFT JOIN ACCOUNTS A ON A.ID = T1.ACCOUNT_ID
LEFT JOIN LEADS L ON L.ID = LF.LEAD_ID
LEFT JOIN MEMBERS M ON ((M.LEAD_ID = T1.LEAD_ID) OR (M.CONTACT_ID = T1.CONTACT_ID)) AND
(M.CAMPAIGN_ID = T1.CAMPAIGN_ID)

所讨论的LEFT JOIN语句是:

LEFT JOIN MEMBERS M ON ((M.LEAD_ID = T1.LEAD_ID) OR (M.CONTACT_ID = T1.CONTACT_ID)) AND
(M.CAMPAIGN_ID = T1.CAMPAIGN_ID)

基本上,上面的LEFT JOIN是基于匹配m.l id_id到T1的连接。LEAD_ID——如果这些都是NULL,那么它将连接m.t act_id。有什么加快速度的办法吗?

增强OR的标准方法是对所有已知的独立结果集进行UNION。

AND给定T1已经是UNION ALL,并且已经有一半已知LEAD_ID为NULL,为什么不早些推M连接…

这意味着你只需要决定如何分割NORMAL_TOUCHPOINTS..现在,如果当lead_id不为空时,contact_id将永远不会匹配,这可能是一个有三个联合的路径。但这需要你有深厚的数据知识。

最新更新