【问题标题】:Optimize query to avoid "Resources exceeded during query execution"优化查询以避免“查询执行期间超出资源”
【发布时间】:2014-06-25 13:14:39
【问题描述】:

我已将此查询保存为视图:

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 表有 1800 万行。

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    查看这个问题了解更多信息:

    What causes "resources exceeded" in BigQuery?

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

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

    【讨论】:

      【解决方案2】:

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

      1) 你真的需要“group each by”吗?您是否尝试过仅使用“分组依据”?

      2) 您是否尝试过使用表格而不是视图?您可以尝试“物化”视图以检查资源消耗是否减少。

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

      干杯!

      【讨论】:

      • 1) 我需要“分组依据”,因为 tarcli 字段包含许多不同的值。 2)我使用视图,因为源表每次都会更改。我试图在一个表中具体化,但资源消耗并没有减少 3) 那么,我如何编写查询?使用UNION查询所有表?问候!
      • 3) 您可以尝试使用联合(将所有表放在 FROM 子句中)或在上层进行一些编排来处理它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多