左内连接与或操作员 - 替代方案?
我正在尝试(在雪花中)在“ snowflake”中使用或操作员在ON子句中的一个或操作员,但是查询需要太长运行。我的问题是,在我的具体情况下是否有其他选择可以使查询更快地执行?以下查询:
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)
所讨论的左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)
基本上,上面的左JOIN是根据匹配的m.lead_id加入t1.lead_id的加入 - 如果这些连接为null,则它将在m.contact_id上加入。关于如何加快事情的想法?
I'm trying to execute (in Snowflake) a LEFT INNER JOIN with an OR operator in the ON clause but the query is taking too long to run. My question is, is there an alternative in my specific case or any other options to make the query execute quicker? Query below:
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)
And the LEFT JOIN statement in question is:
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)
Essentially the LEFT JOIN above is joining based on a matching M.LEAD_ID to the T1.LEAD_ID--and if those are NULL, then it will join on M.CONTACT_ID. Any ideas on how to speed things up?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
提高A和联合的标准方法是所有已知的单独的结果集。
鉴于T1是Aleady Al Union All和一半的联盟,已经知道了leds_id的null,为什么不较早地将M加入。工会。
这意味着您只需要决定如何拆分normal_touchpoints ..现在,如果Lead_ID不为null null Contact_ID将永远不会匹配,那可能是拥有三个工会的途径。但是,这需要深您的数据知识。
The standard way to boost an OR is to UNION ALL known seperate sets of results..
AND given T1 is aleady an UNION ALL and half already have a known to be NULL for LEAD_ID, why not push the M join earlier.. onto those two UNIONS.
Which means you just need to decide how to split NORMAL_TOUCHPOINTS.. now if when lead_id is not null contact_id will never match that might be a path to have three unions.. But this requires deep your data knowledge.