优化查询以避免“在查询执行期间超出资源”

时间:2014-06-25 13:14:39

标签: google-bigquery

我已将此查询保存为View:

SELECT nth(1,CodAlm) as FirstCode, 
nth(1,DesAlm) as FirstDescription, 
last(CodAlm) as LastCode, 
Last(DesAlm) as LastDescription, 
max(DATE(DataTic)) as LastVisit, 
min(DATE(DataTic)) as FirstVisit, 
DATEDIFF(CURRENT_TIMESTAMP(),TIMESTAMP(max(DATE(DataTic)))) as Diffdays,
count(distinct DATE(DataTic)) as countVisits, 
count(distinct CodAlm) as NumberCodes, 
sum(subtot) as Totalimport, 
TarCli, 
Last(nomcli) as Name, 
Last(cogcli) as LastName, 
Last(emailcli) as email, 
Last(sexcli) as gender 
FROM (SELECT CodAlm, DesAlm, DataTic,SubTot, TarCli, NomCli,CogCli,EmailCli,SexCli FROM [bime.Sales] where Year(DataTic)>2012 AND IsFirstLine="1" ORDER by TarCli, DataTic) 
group each by tarcli

但是,当我在此视图上运行任何查询时,bigquery会返回查询执行期间超出的资源。我认为ORDER BY是我的问题的原因,但我需要这个来正确显示我的结果。我怎么能正确地重写这个查询? bime.Sales表有18个Milion行。

2 个答案:

答案 0 :(得分:2)

有关详细信息,请参阅此问题:

What causes "resources exceeded" in BigQuery?

错误很可能是由GROUP EACH BY子句引起的,最可能的原因是你有一个错误的密钥分配(即一个密钥的记录数量不成比例)。你能看看你的数据分布,也许过滤掉任何偏斜的键吗?

另请注意,GROUP EACH BY不保证ORDER BY保留,因此您需要在GROUP EACH BY之后应用排序。如果您想获得可靠的排序,您可能会发现使用分析函数(如FIRST_VALUE,NTH_VALUE和LAST_VALUE)和OVER(PARTITION BY tarcli ORDER BY DataTic)而不是GROUP EACH BY很有用。

答案 1 :(得分:1)

你应该考虑和尝试的一些事情(如果你到目前为止还没有这样做):

1)你真的需要"组各自"?您是否尝试过" group by"?

2)您是否尝试使用表而不是视图?你可以尝试实现"查看资源消耗是否减少的视图。

3)你可以对数据进行分片吗?也许将每年或每月放在不同的表中(使用DataTic)。这会减少每个表的大小,从而减少资源的使用。

干杯!