我试图运行这个查询但是,在我有限的理解水平下,这是非常慢的。
以下是查询:
SELECT
STRFTIME_UTC_USEC(req.date, "%Y-%m-%d") AS day,
HOUR(req.date) AS hour,
10000*(COUNT(req.request_id) - COUNT(resp.request_id)) AS nb_bid_requests,
COUNT(resp.request_id) AS nb_bid_responses,
FROM
[server.Request] req
LEFT JOIN EACH
server.Response resp
ON
req.request_id = resp.request_id
WHERE
DATEDIFF(CURRENT_TIMESTAMP(), req.date) < 3
GROUP EACH BY
day,
hour
ORDER BY
day,
hour
最让我感到困惑的是,这个完全相同的查询在具有相同数据集,表和字段(具有相同数据类型和名称)的Production项目上完美运行。唯一的区别是Production的数据比Dev少。
我在任何情况下都不是SQL专家,我很高兴被告知可以改进查询的地方。
提前谢谢。
编辑:嗨,解决了这个问题。 它是由大量的request_id在server.Response中重复引起的,它减慢了#34;一点点&#34;查询。答案 0 :(得分:0)
尝试在联接内推送WHERE
子句。
BigQuery的优化器还没有(还)在连接中推送谓词,因此您发布的查询会加入所有数据然后对其进行过滤,而不是只加入您关心的部分。如果请求和响应都有date
字段,请在联接的两边放置过滤器!
如果您无法过滤连接的两侧,请切换侧面,以使较小(已过滤)的表位于右侧。由于BQ联接的实现方式,如果较小的表位于右侧,它们通常会表现得更好。
SELECT
STRFTIME_UTC_USEC(req.date, "%Y-%m-%d") AS day,
HOUR(req.date) AS hour,
10000*(COUNT(req.request_id) - COUNT(resp.request_id)) AS nb_bid_requests,
COUNT(resp.request_id) AS nb_bid_responses,
FROM
server.Response resp
RIGHT JOIN EACH
(
SELECT *
FROM
[server.Request]
WHERE
DATEDIFF(CURRENT_TIMESTAMP(), date) < 3
) req
ON
req.request_id = resp.request_id
GROUP EACH BY
day,
hour
ORDER BY
day,
hour