Google Bigquery 通过简单的选择说“响应太大而无法返回”
Posted
技术标签:
【中文标题】Google Bigquery 通过简单的选择说“响应太大而无法返回”【英文标题】:Google Bigquery says "Response too large to return" with simple select 【发布时间】:2015-06-23 14:27:52 【问题描述】:Modifier allowLargeResults 已设置,我也尝试过交互式和批量查询优先级。 search_results 表中有 70M 条记录,searches 中有 10M 条记录,buy 表中有大约(仅)900 条记录。而且 WHERE 还可以很好地减少行数。
SELECT
s.flyFrom, s.to, s.typeFlight, r.price, b.price, b.affily
FROM [sptest.buy] AS b
INNER JOIN [sptest.search_results] AS r
ON b.booking_token=r.booking_token
INNER JOIN [sptest.searches] AS s
ON s.searchid=r.searchid
WHERE
DATE(r.saved_at) >= DATE('2015-06-23 00:00:00') AND
DATE(s.saved_at) >= DATE('2015-06-23 00:00:00')
LIMIT 10
问题可能是由大的连接键引起的吗? booking_token 键是可变大小的 50-600 个字符。
【问题讨论】:
【参考方案1】:我会对这个查询做一些修改:
-
将 WHERE 子句过滤器移近表扫描
使用 JOIN EACH 构造
SELECT
s.flyFrom, s.to, s.typeFlight, r.price, b.price, b.affily
FROM [sptest.buy] AS b
INNER JOIN EACH
(SELECT * FROM [sptest.search_results] WHERE saved_at > DATE('2015-06-23 00:00:00')) AS r
ON b.booking_token=r.booking_token
INNER JOIN EACH
(SELECT * FROM [sptest.searches] WHERE saved_at > DATE('2015-06-23 00:00:00') AS s
ON s.searchid=r.searchid
LIMIT 10
【讨论】:
谢谢!它有效:“8.3 秒过去,61.8 GB 已处理”。我不知道 Bigquery 允许使用这些子查询。 JOIN EACH 结构对我来说很有趣。我的理解是,它用于向查询优化器提示我们正在处理大表。似乎优化器应该已经知道表有多大,并在内部处理它? 是的,你是对的,这是一个提示,在简单的情况下优化器应该知道大小,但是当连接发生在子查询上时 - 它可能会在基数估计中出错。好消息是我们正在(缓慢地)推出更多动态连接算法,这将使 EACH 提示不再需要,但同时它可以提供帮助。以上是关于Google Bigquery 通过简单的选择说“响应太大而无法返回”的主要内容,如果未能解决你的问题,请参考以下文章
从 Google BigQuery 中的选择中排除数组类型字段
在 BigQuery 中回填 Google Analytics
google-cloud-composer BigQuery 跨数据集加载