Bigquery查询JOIN异常缓慢

时间:2015-09-25 11:07:41

标签: sql performance google-bigquery

我试图运行这个查询但是,在我有限的理解水平下,这是非常慢的。

以下是查询:

    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;查询。

1 个答案:

答案 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