我在 BigQuery 中有一个包含以下字段的表:
time,a,b,c,d
time
是一个 ISO8601 格式的字符串,但是有一个空格,a
是一个从 1 到 16000 的整数,其他列是字符串。该表包含一个月的数据,每天有几百万条记录。
以下查询因“响应太大”而失败:
select UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) as day,b,c,d,count(a),count(distinct a, 1000000)
from [myproject.mytable]
group by day,b,c,d
order by day,b,c,d asc
但是,此查询有效(数据从 2012-01-01 开始)
select UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) as day,
b,c,d,count(a),count(distinct a)
from [myproject.mytable]
where UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) = UTC_USEC_TO_DAY(PARSE_UTC_USEC('2012-01-01 00:00:00'))
group by day,b,c,d
order by day,b,c,d asc
这看起来可能与这个问题有关。但是,由于该group by
子句,顶部查询相当于重复调用第二个查询。查询规划器无法处理这个问题吗?
编辑:澄清我的测试数据:
我正在使用我生成的假测试数据。我最初使用了几个字段并尝试获取一个月的每小时摘要(group by hour
,其中小时是在查询部分中定义as
的select
)。当失败时,我尝试切换到每日。当失败时,我减少了所涉及的列。使用 a 时也失败了count (distinct xxx, 1000000)
,但是当我只做了一天的工作时它就起作用了。(如果我删除1000000
参数,它也可以工作,但由于这确实适用于一日查询,因此查询计划程序似乎没有像我预期的那样分离事物。)
检查的count (distinct)
基数为 16,000,按列分组的基数为 2 和 20,总共只有 1200 行。列值很短,大约十个字符。