bigquery在小数据集上执行时间长

vuv7lop3  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(419)

我创建了一个新的google云项目并建立了bigquery数据库。我尝试了不同的查询,它们执行的时间都太长了。目前我们没有太多的数据,所以我们期望高性能。
下面是一些查询及其执行时间的示例。
查询#1(作业id BkuxJob_11022e81_172cd2d59ba):

select date(installtime) regtime
  ,count(distinct userclientid) users
  ,sum(fm.advcost) advspent
from DWH.DimUser du
join DWH.FactMarketingSpent fm on fm.date = date(du.installtime)
group by 1

查询在1小时内失败+错误为“查询超出资源限制”。使用了14521.457814668494 cpu秒,此查询使用的cpu秒数必须小于12800.0。”
查询执行计划:https://prnt.sc/t30bkz
查询#2(作业id bkuxjob_41f963ae_172cd41083f):

select fd.date 
      ,sum(fd.revenue) adrevenue
      ,sum(fm.advcost) advspent
from DWH.FactAdRevenue fd
join DWH.FactMarketingSpent fm on fm.date = fd.date
group by 1

执行时间59.3秒,已处理7.7 mb。什么太慢了。
查询执行计划:https://prnt.sc/t309t4
查询#3(作业id bkuxjob_3b19482d_172cd31f629)

select date(installtime) regtime
  ,count(distinct userclientid) users 
from DWH.DimUser du 
group by 1

执行时间已过5.0秒,处理了42.3 mb。这并不可怕,但对于如此小的数据量必须更快。
使用的表:dimuser-表大小870.71 mb,行数2771379-表大小6.98 mb,行数53816-表大小68.57 mb,行数453600
问题是我做错了什么,以至于查询执行时间如此之长?如果一切正常,我将很高兴听到任何关于如何减少这些简单查询的执行时间的建议。如果有人从谷歌阅读我的问题,我会感谢如果作业ID检查。
谢谢您!
p、 以前我有在其他项目中使用bigquery的经验,对于大小超过50 tb的表,性能和执行时间都非常好。

ltskdhd1

ltskdhd11#

发布我在gcp slack工作区中给出的相同回复:
前两个查询看起来都有一个特定的worker过载。可以看到这一点,因为在计算部分,最大时间与平均时间非常不同。这可能有很多原因,但我可以看到您正在将一个700k+行的表(查看第二个输入)连接到一个~50k行的表(查看第一个输入)。这不是一个好的做法,你应该切换它,使较大的表是最左边的表。看到了吗https://cloud.google.com/bigquery/docs/best-practices-performance-compute?hl=en_us#optimize_your_join_patterns
连接键中也可能存在严重的倾斜(例如,90%的行位于1/1/2020或null)。看看这个。
对于第三个查询,这是预期的时间,请尝试使用近似计数来加快查询速度。另外请注意,如果您反复执行相同的查询,bq开始变得更好,因此这将变得更快。

相关问题