Google bigquery Chrome UX报告:提高查询性能
我正在使用以下查询查询Chrome UX报告公共数据集,以获取一组特定于国家/地区的表的随时间变化的指标值。查询运行了很长时间,我在180秒时停止了它,因为我不知道查询的超时时间是多少,也不知道如何判断查询是否挂起 我试图获得平均fcp、平均fp和平均dcl的年度累计数据。我不确定是否正确使用了BigQuery,或者是否有方法优化查询以使其运行更快 这就是我正在使用的查询 选择 _表_后缀为yyyymm, 平均密度作为平均值, 平均密度作为平均值, 平均密度作为平均值 从…起 `chrome用户体验报告。国家/地区。*`, unnest first_paint.histogram.bin作为fp, UNNESTdom_content_loaded.histogram.bin作为dcl, UNNESTfirst_contentful_paint.histogram.bin作为fcp 哪里 form_factor.name=‘桌面’和 fcp.start>20000 分组 年月 订购人 年月 让我开始说,这是非常长的6个小时,所以你不应该在这方面有问题,但你可能会遇到其他错误 我们内部也有同样的问题,我们有一些数据集,数据被划分在国家表中,即使在对大量的表进行查询时,这些表是按时间戳进行划分的,但查询不仅需要很长时间,有时还会因资源超出错误而失败 我们的解决方案是将所有这些表聚合到一个单独的表中,添加“country”列,并将其用作集群列。这不仅使我们的查询得以执行,而且使它们比我们的临时解决方案更快,我们的临时解决方案是在国家/地区表的子集上运行相同的查询作为中间步骤,然后将结果组合在一起。它现在更快、更容易、更干净 回到您的具体问题,我建议创建一个新表,您将需要它承载$$$,它是数据集中所有表的组合,作为分区表 最快的方法是使用CREATETABLE语句,不幸的是,您将为查询扫描支付更昂贵的费用Google bigquery Chrome UX报告:提高查询性能,google-bigquery,chrome-ux-report,Google Bigquery,Chrome Ux Report,我正在使用以下查询查询Chrome UX报告公共数据集,以获取一组特定于国家/地区的表的随时间变化的指标值。查询运行了很长时间,我在180秒时停止了它,因为我不知道查询的超时时间是多少,也不知道如何判断查询是否挂起 我试图获得平均fcp、平均fp和平均dcl的年度累计数据。我不确定是否正确使用了BigQuery,或者是否有方法优化查询以使其运行更快 这就是我正在使用的查询 选择 _表_后缀为yyyymm, 平均密度作为平均值, 平均密度作为平均值, 平均密度作为平均值 从…起 `chrome用户
create table `project_id.dataset_id.table_id`
partition by date_month
cluster by origin
as (
select
date(PARSE_TIMESTAMP("%Y%m%d", concat(_table_suffix, "01"), "UTC")) as date_month,
*
from `chrome-ux-report.country_cl.*`
);
如果此查询失败,您可以在表的子集上运行它,例如,其中以表的后缀“2018”开始,并针对您之前创建的表运行以下带有“写入附加”配置的查询
select
date(PARSE_TIMESTAMP("%Y%m%d", concat(_table_suffix, "01"), "UTC")) as date_month,
*
from `chrome-ux-report.country_cl.*`
where starts_with(_table_suffix, '2019')
如果你注意到了,我还使用了一个集群列,这是一个最佳实践
请注意,谁在管理谷歌公共数据集
如果有一个公共chrome_ux_报告数据集,其中只有一个按日期分区并按国家/地区聚集的表,那就太好了。仔细查看您的查询后,我得出结论,您正在执行的每个操作的处理时间大约为6秒或更短。因此,我决定从每个unnest执行每个任务,然后使用方法将表附加在一起 查询在4秒内运行。语法是:
SELECT
_TABLE_SUFFIX AS yyyymm,
AVG(fcp.density) AS average_fcp,
FROM
`chrome-ux-report.country_cl.*`,
UNNEST(first_contentful_paint.histogram.bin) AS fcp
WHERE
form_factor.name = 'desktop' AND
fcp.start > 20000
GROUP BY
yyyymm
UNION ALL
SELECT
_TABLE_SUFFIX AS yyyymm,
AVG(fp.density) as average_fp,
FROM
`chrome-ux-report.country_cl.*`,
UNNEST(first_paint.histogram.bin) as fp
WHERE
form_factor.name = 'desktop'
GROUP BY
yyyymm
UNION ALL
SELECT
_TABLE_SUFFIX AS yyyymm,
AVG(dcl.density) as average_dcl
FROM
`chrome-ux-report.country_cl.*`,
UNNEST(dom_content_loaded.histogram.bin) as dcl
WHERE
form_factor.name = 'desktop'
GROUP BY
yyyymm
ORDER BY
yyyymm
此外,我想指出,根据文档,建议避免过度使用通配符,选择使用日期范围并具体化大型数据集结果。另外,我想将BigQuery指向10gb
我希望这能有所帮助。我不确定得到所有密度的平均值在数学上是否有意义,但我们还是这样做吧 查询中更大的问题是:
UNNEST(first_paint.histogram.bin) as fp,
UNNEST(dom_content_loaded.histogram.bin) as dcl,
UNNEST(first_contentful_paint.histogram.bin) AS fcp
-这是一个爆炸性的连接:它将一行3个数组(每个数组约500个元素)转换为1.25亿行!!!这就是查询没有运行的原因
提供类似结果的类似查询:
选择yyyymm,
平均值平均值,
平均值平均值,
平均值平均值
从…起
选择
_表_后缀为yyyymm,
从UNNESTfirst_contentful_paint.histogram.bin fcp中选择AVGfcp.density,其中fcp.start>20000作为平均值,
从UNNESTfirst_paint.histogram.bin fp中选择AVGfp.density作为平均值_fp,
从UNNESTdom\u content\u loaded.histogram.bin dcl中选择AVGdcl.density作为平均值\u dcl
摘自“chrome ux report.country_cl.*”
其中form_factor.name='桌面'
按yyyymm分组
yyyymm前订购
好消息是:此查询运行时间为3.3秒
现在查询只需3秒钟,最重要的问题是:它在数学上有意义吗
奖励:从数学上讲,这个查询对我来说更有意义,但我不是100%确定:
选择yyyymm,
平均值平均值,
平均值平均值,
平均值平均值
从…起
选择yyyymm、原点、SUMweighted\u fcp average\u fcp、SUMweighted\u fp average\u fp、SUMweighted\u dcl average\u dcl
从…起
选择
_表_后缀为yyyymm,
从UNNESTfirst_contentful_paint.histogram.bin中选择SUMstart*密度作为加权值_fcp,
从UNNESTfirst_paint.histogram.bin中选择SUMstart*密度作为加权_fp,
从UNNESTdom\u content\u loaded.histogram.bin中选择SUMstart*density作为加权的\u dcl,
o
里金
摘自“chrome ux report.country_cl.*”
按来源分组,yyyymm
按yyyymm分组
yyyymm前订购
我最初使用sum,但不确定哪一个更好。我已经用这两种方法进行了测试,但在示例I postedI中,我添加了一个更有意义的额外查询-我们现在缺少的是您想要回答的基本问题,可能是一个新的堆栈溢出问题,说明了您的目标。对于这个问题,我们解决了查询效率的问题。很好的观察!我补充了另一个答案,指出问题是做3次不必要的尝试