2015-09-25 58 views
0

我试图运行此查询,但它是,对我理解水平有限,荒谬缓慢。Bigquery查询JOIN异常缓慢

下面是该查询:

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 

什么错误我最深的是,这个完全相同的查询工作完全正常上具有相同的数据集,表和字段(具有相同的数据类型的生产项目,名)。唯一的区别是生产比Dev有更多的数据。

我不是任何情况下的SQL专家,我很乐意被告知我在哪里可以改进查询。

预先感谢您。

编辑:嗨,解决了这个问题。 这是由大量的request_id在服务器中重复引起的。响应减慢了“一点点”的查询速度。

+0

统计差异?多少日期(与开发者相比)?次2次,10次,100次甚至更多? – jarlh

+0

在prod中,您运行我们的系统,这会大量使用我们的基础架构。在Dev上运行时,您可以模拟相同的操作,但需要使用自己的计算机。这可能发生在这里。 (当然假设你是指本地开发服务器,而不仅仅是一个不同的环境) – Patrice

+0

给我们一些数字,数据有多大,查询的持续时间,输出大小,你运行的频率? – Pentium10

回答

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