【发布时间】:2018-05-31 22:30:58
【问题描述】:
背景
假设我有以下表格:
-- 33M rows
CREATE TABLE lkp.session (
session_id BIGINT,
visitor_id BIGINT,
session_datetime TIMESTAMP
);
-- 17M rows
CREATE TABLE lkp.visitor_customer_hist (
visitor_id BIGINT,
customer_id BIGINT,
from_datetime TIMESTAMP,
to_datetime TIMESTAMP
);
Visitor_customer_hist 给出在每个时间点对每个访问者有效的 customer_id。
目标是使用 visitor_id 和 session_datetime 查找对每个会话有效的客户 ID。
CREATE TABLE lkp.session_effective_customer AS
SELECT
s.session_id,
vch.customer_id AS effective_customer_id
FROM lkp.session s
JOIN lkp.visitor_customer_hist vch ON vch.visitor_id = s.visitor_id
AND s.session_datetime >= vch.from_datetime
AND s.session_datetime < vch.to_datetime;
问题
即使仓库规模扩大,这个查询非常很慢。耗时 1h15m 完成,是仓库中唯一运行的查询。
我确认visitor_customer_hist 中没有重叠值,如果存在重叠值可能会导致重复连接。
snowflake 真的不擅长这种连接吗?我正在寻找有关如何优化此类查询、重新聚类或任何优化技术或重新处理查询的表的建议,例如可能是相关子查询之类的。
其他信息
【问题讨论】:
-
这似乎出奇的长。我想知道 visitor_customer_history 中每个访问者有多少行——可能会导致连接爆炸。作为线索,运行以下命令需要多长时间(结果是什么)? SELECT count(*) FROM lkp.session s JOIN lkp.visitor_customer_hist vch ON vch.visitor_id = s.visitor_id
-
我希望你能看到这个!重新加入爆炸,我们可以从插入中看到行没有被加入重复...但是 98% 的访问者有
-
我会尝试排除超过 1000 条记录的访问者,看看它是否会更快...
-
这绝对是出乎意料的。我会联系 Snowflake 支持,提供确切的查询 ID,他们可能会提供更多帮助。
-
另外,@chorbs 所说的可能会有所帮助——即使没有重叠的值,连接在 visitor_id 上也是“快”的,因为它是相等的,然后在时间范围上是“慢”的。如果例如两个表中有 100,000 个相同的 visitor_id 实例,这将导致连接内的严重爆炸。
标签: snowflake-cloud-data-platform