【发布时间】:2016-01-15 02:06:49
【问题描述】:
最近我的所有查询都花费了很长时间,但基本上都没有消耗任何数据。
例如,对于一个非常简单的查询
Start Time: Jan 14, 2016, 12:35:13 PM
End Time: Jan 14, 2016, 12:35:15 PM
Bytes Processed: 0 B
Bytes Billed: 0 B
Billing Tier: 1
Destination Table: ****************.******************
Write Preference: Append to table
Allow Large Results: true
Flatten Results: true
这是我从 BQ 控制台得到的信息,告诉我这个查询不消耗任何数据(确实如此),只需要两秒钟。
但是当我在控制台中通过单击查询历史记录中的Run Query 再次运行此查询时,实际上需要 27 秒。之后,控制台中的Query History 再次显示此查询需要 2 秒。
基本上这个数据集中的所有查询都有这个问题。
我在这个数据集中有超过 40000 个表。
所以我的猜测是,在 BQ 实际运行查询之前,它首先找到要使用的表。然后它开始执行查询,这里是查询历史中的start time。
如果是这样,我应该如何解决它,为什么需要这么长时间?
这是我提到的查询(做了一些更改):
select "some_id", '2015-12-01', if (count(user_id) == 0, NULL, sum(users_in_today_again) / count(user_id)) as retention
from
(
select
users_in_last_day.user_id as user_id,
if(users_in_today.user_id is null, 0, 1) as users_in_today_again
FROM
(
select user_id
from
table_date_range(ds.sessions_some_id_, date_add(timestamp('2015-12-01'), -1, "DAY"), date_add(timestamp('2015-12-01'), -1, "DAY"))
group by user_id
) as users_in_last_day
left join
(
select user_id
from table_date_range(ds.sessions_some_id_, timestamp('2015-12-01'), timestamp('2015-12-01'))
group by user_id
) as users_in_today
on users_in_last_day.user_id = users_in_today.user_id
)
提前致谢!
【问题讨论】:
-
哎呀!这是一个非常讨厌的查询。如果您正在做如此复杂的事情,我强烈建议您以编程方式发出查询,并且基本上执行一系列查询,您可以在其中获取一个查询的输出以以编程方式生成下一个查询。在这里的问题中,我认为您提到“count(user_id)”可能会导致整个表在每条记录上被迭代以计算用户数。尝试先单独发出计数查询,然后在后续过程中引用它的值。
-
(Cloud Dataflow 可能是此处使用 BigQuery 的另一种选择)。
-
@MichaelAaronSafyan 感谢您的回复。我不认为处理的行数是这个问题的原因。正如我所提到的,这个查询没有处理任何数据。表 session_some_id_20151201 为空。而且我尝试按照您的建议从顶部删除
count(user_id),时间没有改变。
标签: google-bigquery