首页 > 解决方案 > 大查询。小数据集的执行时间长

问题描述

我创建了一个新的 Google 云项目并设置了 BigQuery 数据库。我尝试了不同的查询,它们都执行太久。目前我们没有很多数据,因此预计会有高性能。

下面是一些查询示例及其执行时间。

查询 #1(作业 ID bquxjob_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 秒,并且此查询必须使用少于 12800.0 CPU 秒。”

查询执行计划:https ://prnt.sc/t30bkz

查询 #2(作业 ID bquxjob_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 bquxjob_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,行数 2,771,379 FactAdRevenue - 表格大小 6.98 MB,行数 53,816 FaceMarketingSpent - 表格大小 68.57 MB,行数 453,600

问题是我做错了什么以至于查询执行时间如此之长?如果一切正常,我很高兴听到有关如何减少此类简单查询的执行时间的任何建议。如果谷歌的任何人读到我的问题,如果检查作业,我将不胜感激。

谢谢!

Ps 以前我曾在其他项目中使用过 BigQuery,对于 50+ TB 大小的表,性能和执行时间非常好。

标签: sqlgoogle-cloud-platformgoogle-bigquery

解决方案


发布我在 gcp slack 工作区中给出的相同回复:

您的前两个查询看起来都像您有一个超载的特定工作人员。可以看到这一点,因为在计算部分,最大时间与平均时间有很大不同。这可能有多种原因,但我可以看到您正在将 700k+ 行的表(查看第二个输入)加入到一个约 50k 的表(查看第一个输入)中。这不是一个好的做法,您应该切换它,以便较大的表是最左边的表。请参阅https://cloud.google.com/bigquery/docs/best-practices-performance-compute?hl=en_US#optimize_your_join_patterns

您的连接键也可能存在严重偏差(例如,90% 的行位于 2020 年 1 月 1 日或 NULL)。检查这个。

对于第三个查询,该时间是预期的,请尝试近似计数以加快速度。另请注意,如果您一遍又一遍地执行相同的查询,BQ 会开始变得更好,因此这会变得更快。


推荐阅读