1

使用我们的测试数据集运行以下查询需要 18 多分钟:

SELECT count(distinct S1.visitorId, 50000) as returningVisitors, 
STRFTIME_UTC_USEC(UTC_USEC_TO_DAY(PARSE_UTC_USEC(S1.timeStamp)), '%Y-%m-%d') AS day,
S1.dimension1, S1.dimension2
FROM [myDataset.MyTable] as S1 
JOIN EACH [myDataset.MyTable] as S2 on S1.visitorId= S2.visitorId
WHERE UTC_USEC_TO_DAY(PARSE_UTC_USEC(S1.timeStamp)) < UTC_USEC_TO_DAY(NOW()) and
S2.timeStamp < STRFTIME_UTC_USEC(UTC_USEC_TO_DAY(PARSE_UTC_USEC(S1.timeStamp)), '%Y-%m-%d') 
GROUP EACH BY S1.dimension1, S1.dimension2, day 
ORDER BY S1.dimension1, S1.dimension2, day;

最后,我在 Web 浏览器中收到以下消息:“查询完成(经过 1112.1 秒,已处理 1.62 MB)”

我想知道为什么花了这么长时间。我通常使用 BigQuery 获得更快的结果。

该查询在同一个表上执行 JOIN 以获得每天和维度的回访者数量。我预计查询可能需要 5-6 分钟,但不是 18 分钟,尤其是因为表不是那么大。

我的表大约有 31000 行,总大小为 4.25 Mb。我的工作 ID 是:job_b657aceeb1004994b0b0332d461cdcd2

4

1 回答 1

3

此查询是否仍需要很长时间才能处理?如果它只发生一次,那么“为什么”可能是一个罕见的内部性能问题。

告诉我我是否正确:您自己加入表格的唯一原因是检查用户以前是否去过那里?在这种情况下,您生成的组合数量呈指数增长(我使用这个词对吗?),而无需这样做。该查询仅引用 S2 一次,以检查它是否小于当前行的时间戳日期。

如果你更换:

JOIN EACH [myDataset.MyTable] as S2 on S1.visitorId= S2.visitorId

和:

JOIN EACH 
(SELECT visitorId, MIN(timeStamp) timeStamp FROM [myDataset.MyTable] GROUP EACH BY 1) S2
ON S1.visitorId= S2.visitorId

要得到:

SELECT count(distinct S1.visitorId, 50000) as returningVisitors, 
STRFTIME_UTC_USEC(UTC_USEC_TO_DAY(PARSE_UTC_USEC(S1.timeStamp)), '%Y-%m-%d') AS day,
S1.dimension1, S1.dimension2
FROM [myDataset.MyTable] as S1 
JOIN EACH 
(SELECT visitorId, MIN(timeStamp) timeStamp FROM [myDataset.MyTable] GROUP EACH BY 1) S2
ON S1.visitorId= S2.visitorId    WHERE UTC_USEC_TO_DAY(PARSE_UTC_USEC(S1.timeStamp)) < UTC_USEC_TO_DAY(NOW()) and
S2.timeStamp < STRFTIME_UTC_USEC(UTC_USEC_TO_DAY(PARSE_UTC_USEC(S1.timeStamp)), '%Y-%m-%d') 
GROUP EACH BY S1.dimension1, S1.dimension2, day 
ORDER BY S1.dimension1, S1.dimension2, day;

?

一些注意事项:

  • 尝试用具体的日期时间替换 NOW() - 这样您的查询就可以被缓存。
于 2013-10-09T01:04:51.093 回答