sql - 大查询。小数据集的执行时间长
问题描述
我创建了一个新的 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 大小的表,性能和执行时间非常好。
解决方案
发布我在 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 会开始变得更好,因此这会变得更快。
推荐阅读
- php - MongoDB和PHP连接
- python - 如何最好地使用 python 创建一个简单的、交互式的、可共享的图?
- django - 从视图集调用时未触发模型的方法 .clean()
- android - 我的启动收到的广播接收器没有在启动时启动
- reporting-services - 我在 ssrs 中创建了一份带有日期参数的报告
- hyperledger-composer - 如何使用查询或 js 从 Hyperledger Composer 中提取唯一数据
- sql - DB2 高效的选择查询,带有许多值的 like 运算符(~200)
- python - X 列既不是 GROUPED 也不是 AGGREGATED - StandardSQL / BigQuery
- javascript - 使用 javascript 导出 html 表时更改 XLS 页边距
- sqlite - 使用 NSPersistentContainer 从 Core Data SQLite 存储中回收空间?