【问题标题】:Filtering a query causes "Response too large" error过滤查询会导致“响应过大”错误
【发布时间】:2012-11-21 08:03:17
【问题描述】:

运行查询

SELECT project, test_id, log_time,
       connection_spec.client_geolocation.latitude, 
       connection_spec.client_geolocation.longitude
FROM m_lab.2012_11
GROUP BY project, test_id, log_time,
         connection_spec.client_geolocation.latitude, 
         connection_spec.client_geolocation.longitude
ORDER BY log_time LIMIT 6

大约 20 秒后成功

但是,向它添加一个 WHERE 子句应该会减少返回的行数

SELECT project, test_id, log_time,
       connection_spec.client_geolocation.latitude, 
       connection_spec.client_geolocation.longitude
FROM m_lab.2012_11
WHERE log_time > 0
GROUP BY project, test_id, log_time,
         connection_spec.client_geolocation.latitude, 
         connection_spec.client_geolocation.longitude
ORDER BY log_time LIMIT 6

导致错误“响应太大而无法返回”。

我的期望是限制返回的行会增加执行时间,因为需要扫描更多的行,但响应应该是相同的大小。我错过了什么?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    首先,扫描的行数是恒定的。 BigQuery 不会(按设计)为行编制索引,而是对您指定的表执行全表扫描。

    在这个 m-lab 表中有数十亿行,我认为这里的普遍问题是通过多个 GROUP BY 生成的唯一结果的数量在两个查询中都非常大,这会产生“响应太大”的错误BigQuery 执行树中的节点。

    一种方法:

    处理此查询的一种方法是使用我们称为GROUP EACH BY 的新功能。这提供了应用混洗操作来平衡服务树上的分组。当每个 GROUP 'bucket' 有许多单独的值时,它的效果最好。在 m-lab 数据集中,几乎每个条目都附加到项目“0”,因此我将从查询结果中删除它,并从 GROUP EACH BY 另一个更多的值中删除:

    SELECT test_id, log_time,  connection_spec.client_geolocation.latitude,  connection_spec.client_geolocation.longitude
    FROM
      [measurement-lab:m_lab.2012_11]
    WHERE
      log_time > 0 AND project = 0
    GROUP EACH BY
      test_id, log_time, connection_spec.client_geolocation.latitude,   connection_spec.client_geolocation.longitude
    ORDER BY log_time LIMIT 6;
    

    另一种策略:

    您查询的结果按 log_time 的顺序列出结果,这意味着您实际上只返回最早的 log_time 数据点。为什么不为一组时间点运行子选择,然后使用 WHERE 子句中的结果集运行 GROUP BY。此查询的运行速度应该比其他示例快得多:

    SELECT
      test_id, log_time, connection_spec.client_geolocation.latitude, connection_spec.client_geolocation.longitude, COUNT(*) AS entry_count      
    FROM
      [measurement-lab:m_lab.2012_11]
    WHERE
      project = 0 AND log_time IN
      (SELECT log_time FROM [measurement-lab:m_lab.2012_11] WHERE log_time > 0 GROUP BY log_time ORDER BY log_time LIMIT 6)
    GROUP BY
      test_id, log_time, connection_spec.client_geolocation.latitude, connection_spec.client_geolocation.longitude  ORDER BY log_time, entry_count;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 2016-11-28
      相关资源
      最近更新 更多