运行查询
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
会导致错误“响应太大而无法返回。”
我的期望是限制返回的行会增加执行时间,因为需要扫描更多行,但响应应该是相同的大小。我错过了什么?
答案 0 :(得分:3)
首先,扫描的行数是不变的。 BigQuery不会对行进行索引(按设计),并在您指定的表上执行全表扫描。
在这个m-lab表中有数十亿行,我认为这里的一般问题是通过多个GROUP BY生成的唯一结果的数量在两个查询中都非常大,这会对个体产生“响应太大”错误BigQuery执行树中的节点。
一种方法:
处理此查询的一种方法是使用我们称为GROUP EACH BY
的新功能。这提供了应用shuffle操作来平衡服务树上的分组。当每个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;