2

运行查询

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

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

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

4

1 回答 1

3

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

在这个 m-lab 表中有数十亿行,我认为这里的一般问题是通过多个 GROUP BY 生成的唯一结果的数量在两个查询中都非常大,这会为BigQuery 执行树。

一种方法:

处理此查询的一种方法是使用我们称为的新功能GROUP EACH BY。这提供了应用洗牌操作来平衡服务树上的分组。GROUP当每个“桶”有许多单独的值时,它的效果最好。在 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;
于 2012-11-20T23:44:43.180 回答